/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- *//* vim: set ts=8 sts=2 et sw=2 tw=80: *//* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. *//* DOM object returned from element.getComputedStyle() */#include"nsComputedDOMStyle.h"#include"mozilla/ArrayUtils.h"#include"mozilla/Preferences.h"#include"nsError.h"#include"nsIDOMCSSPrimitiveValue.h"#include"nsIFrame.h"#include"nsIFrameInlines.h"#include"nsStyleContext.h"#include"nsIScrollableFrame.h"#include"nsContentUtils.h"#include"nsIContent.h"#include"nsDOMCSSRect.h"#include"nsDOMCSSRGBColor.h"#include"nsDOMCSSValueList.h"#include"nsFlexContainerFrame.h"#include"nsGridContainerFrame.h"#include"nsGkAtoms.h"#include"mozilla/ReflowInput.h"#include"nsStyleUtil.h"#include"nsStyleStructInlines.h"#include"nsROCSSPrimitiveValue.h"#include"nsPresContext.h"#include"nsIDocument.h"#include"nsCSSPseudoElements.h"#include"mozilla/StyleSetHandle.h"#include"mozilla/StyleSetHandleInlines.h"#include"mozilla/GeckoRestyleManager.h"#include"mozilla/RestyleManagerInlines.h"#include"imgIRequest.h"#include"nsLayoutUtils.h"#include"nsCSSKeywords.h"#include"nsStyleCoord.h"#include"nsDisplayList.h"#include"nsDOMCSSDeclaration.h"#include"nsStyleTransformMatrix.h"#include"mozilla/dom/Element.h"#include"prtime.h"#include"nsWrapperCacheInlines.h"#include"mozilla/AppUnits.h"#include<algorithm>#include"nsStyleContextInlines.h"usingnamespacemozilla;usingnamespacemozilla::dom;#if defined(DEBUG_bzbarsky) || defined(DEBUG_caillon)#define DEBUG_ComputedDOMStyle#endif/* * This is the implementation of the readonly CSSStyleDeclaration that is * returned by the getComputedStyle() function. */already_AddRefed<nsComputedDOMStyle>NS_NewComputedDOMStyle(dom::Element*aElement,constnsAString&aPseudoElt,nsIPresShell*aPresShell,nsComputedDOMStyle::StyleTypeaStyleType,nsComputedDOMStyle::AnimationFlagaFlag){RefPtr<nsComputedDOMStyle>computedStyle;computedStyle=newnsComputedDOMStyle(aElement,aPseudoElt,aPresShell,aStyleType,aFlag);returncomputedStyle.forget();}staticnsDOMCSSValueList*GetROCSSValueList(boolaCommaDelimited){returnnewnsDOMCSSValueList(aCommaDelimited,true);}template<typenameT>already_AddRefed<CSSValue>GetBackgroundList(TnsStyleImageLayers::Layer::*aMember,uint32_tnsStyleImageLayers::*aCount,constnsStyleImageLayers&aLayers,constnsCSSProps::KTableEntryaTable[]){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(uint32_ti=0,i_end=aLayers.*aCount;i<i_end;++i){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(aLayers.mLayers[i].*aMember,aTable));valueList->AppendCSSValue(val.forget());}returnvalueList.forget();}/** * An object that represents the ordered set of properties that are exposed on * an nsComputedDOMStyle object and how their computed values can be obtained. */structnsComputedStyleMap{friendclassnsComputedDOMStyle;structEntry{// Create a pointer-to-member-function type.typedefalready_AddRefed<CSSValue>(nsComputedDOMStyle::*ComputeMethod)();nsCSSPropertyIDmProperty;ComputeMethodmGetter;boolIsLayoutFlushNeeded()const{returnnsCSSProps::PropHasFlags(mProperty,CSS_PROPERTY_GETCS_NEEDS_LAYOUT_FLUSH);}boolIsEnabled()const{returnnsCSSProps::IsEnabled(mProperty,CSSEnabledState::eForAllContent);}};// We define this enum just to count the total number of properties that can// be exposed on an nsComputedDOMStyle, including properties that may be// disabled.enum{#define COMPUTED_STYLE_PROP(prop_, method_) \ eComputedStyleProperty_##prop_,#include"nsComputedDOMStylePropertyList.h"#undef COMPUTED_STYLE_PROPeComputedStyleProperty_COUNT};/** * Returns the number of properties that should be exposed on an * nsComputedDOMStyle, ecxluding any disabled properties. */uint32_tLength(){Update();returnmExposedPropertyCount;}/** * Returns the property at the given index in the list of properties * that should be exposed on an nsComputedDOMStyle, excluding any * disabled properties. */nsCSSPropertyIDPropertyAt(uint32_taIndex){Update();returnkEntries[EntryIndex(aIndex)].mProperty;}/** * Searches for and returns the computed style map entry for the given * property, or nullptr if the property is not exposed on nsComputedDOMStyle * or is currently disabled. */constEntry*FindEntryForProperty(nsCSSPropertyIDaPropID){Update();for(uint32_ti=0;i<mExposedPropertyCount;i++){constEntry*entry=&kEntries[EntryIndex(i)];if(entry->mProperty==aPropID){returnentry;}}returnnullptr;}/** * Records that mIndexMap needs updating, due to prefs changing that could * affect the set of properties exposed on an nsComputedDOMStyle. */voidMarkDirty(){mExposedPropertyCount=0;}// The member variables are public so that we can use an initializer in// nsComputedDOMStyle::GetComputedStyleMap. Use the member functions// above to get information from this object./** * An entry for each property that can be exposed on an nsComputedDOMStyle. */constEntrykEntries[eComputedStyleProperty_COUNT];/** * The number of properties that should be exposed on an nsComputedDOMStyle. * This will be less than eComputedStyleProperty_COUNT if some property * prefs are disabled. A value of 0 indicates that it and mIndexMap are out * of date. */uint32_tmExposedPropertyCount;/** * A map of indexes on the nsComputedDOMStyle object to indexes into kEntries. */uint32_tmIndexMap[eComputedStyleProperty_COUNT];private:/** * Returns whether mExposedPropertyCount and mIndexMap are out of date. */boolIsDirty(){returnmExposedPropertyCount==0;}/** * Updates mExposedPropertyCount and mIndexMap to take into account properties * whose prefs are currently disabled. */voidUpdate();/** * Maps an nsComputedDOMStyle indexed getter index to an index into kEntries. */uint32_tEntryIndex(uint32_taIndex)const{MOZ_ASSERT(aIndex<mExposedPropertyCount);returnmIndexMap[aIndex];}};voidnsComputedStyleMap::Update(){if(!IsDirty()){return;}uint32_tindex=0;for(uint32_ti=0;i<eComputedStyleProperty_COUNT;i++){if(kEntries[i].IsEnabled()){mIndexMap[index++]=i;}}mExposedPropertyCount=index;}nsComputedDOMStyle::nsComputedDOMStyle(dom::Element*aElement,constnsAString&aPseudoElt,nsIPresShell*aPresShell,StyleTypeaStyleType,AnimationFlagaFlag):mDocumentWeak(nullptr),mOuterFrame(nullptr),mInnerFrame(nullptr),mPresShell(nullptr),mStyleType(aStyleType),mStyleContextGeneration(0),mExposeVisitedStyle(false),mResolvedStyleContext(false),mAnimationFlag(aFlag){MOZ_ASSERT(aElement&&aPresShell);mDocumentWeak=do_GetWeakReference(aPresShell->GetDocument());mContent=aElement;mPseudo=nsCSSPseudoElements::GetPseudoAtom(aPseudoElt);MOZ_ASSERT(aPresShell->GetPresContext());}nsComputedDOMStyle::~nsComputedDOMStyle(){ClearStyleContext();}NS_IMPL_CYCLE_COLLECTION_CLASS(nsComputedDOMStyle)NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsComputedDOMStyle)tmp->ClearStyleContext();// remove observer before clearing mContentNS_IMPL_CYCLE_COLLECTION_UNLINK(mContent)NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPERNS_IMPL_CYCLE_COLLECTION_UNLINK_ENDNS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsComputedDOMStyle)NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mContent)NS_IMPL_CYCLE_COLLECTION_TRAVERSE_ENDNS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(nsComputedDOMStyle)NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsComputedDOMStyle)returntmp->HasKnownLiveWrapper();NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_ENDNS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsComputedDOMStyle)returntmp->HasKnownLiveWrapper();NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_ENDNS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsComputedDOMStyle)returntmp->HasKnownLiveWrapper();NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END// QueryInterface implementation for nsComputedDOMStyleNS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsComputedDOMStyle)NS_WRAPPERCACHE_INTERFACE_MAP_ENTRYNS_INTERFACE_MAP_ENTRY(nsIMutationObserver)NS_INTERFACE_MAP_END_INHERITING(nsDOMCSSDeclaration)NS_IMPL_CYCLE_COLLECTING_ADDREF(nsComputedDOMStyle)NS_IMPL_CYCLE_COLLECTING_RELEASE(nsComputedDOMStyle)NS_IMETHODIMPnsComputedDOMStyle::GetPropertyValue(constnsCSSPropertyIDaPropID,nsAString&aValue){// This is mostly to avoid code duplication with GetPropertyCSSValue(); if// perf ever becomes an issue here (doubtful), we can look into changing// this.returnGetPropertyValue(NS_ConvertASCIItoUTF16(nsCSSProps::GetStringValue(aPropID)),aValue);}NS_IMETHODIMPnsComputedDOMStyle::SetPropertyValue(constnsCSSPropertyIDaPropID,constnsAString&aValue){returnNS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR;}NS_IMETHODIMPnsComputedDOMStyle::GetCssText(nsAString&aCssText){aCssText.Truncate();returnNS_OK;}NS_IMETHODIMPnsComputedDOMStyle::SetCssText(constnsAString&aCssText){returnNS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR;}NS_IMETHODIMPnsComputedDOMStyle::GetLength(uint32_t*aLength){NS_PRECONDITION(aLength,"Null aLength! Prepare to die!");uint32_tlength=GetComputedStyleMap()->Length();// Make sure we have up to date style so that we can include custom// properties.UpdateCurrentStyleSources(false);if(mStyleContext){length+=mStyleContext->IsServo()?Servo_GetCustomPropertiesCount(mStyleContext->ComputedValues()):StyleVariables()->mVariables.Count();}*aLength=length;ClearCurrentStyleSources();returnNS_OK;}NS_IMETHODIMPnsComputedDOMStyle::GetParentRule(nsIDOMCSSRule**aParentRule){*aParentRule=nullptr;returnNS_OK;}NS_IMETHODIMPnsComputedDOMStyle::GetPropertyValue(constnsAString&aPropertyName,nsAString&aReturn){aReturn.Truncate();ErrorResulterror;RefPtr<CSSValue>val=GetPropertyCSSValue(aPropertyName,error);if(error.Failed()){returnerror.StealNSResult();}if(val){nsStringtext;val->GetCssText(text,error);aReturn.Assign(text);returnerror.StealNSResult();}returnNS_OK;}NS_IMETHODIMPnsComputedDOMStyle::GetAuthoredPropertyValue(constnsAString&aPropertyName,nsAString&aReturn){// Authored style doesn't make sense to return from computed DOM style,// so just return whatever GetPropertyValue() returns.returnGetPropertyValue(aPropertyName,aReturn);}/* static */already_AddRefed<nsStyleContext>nsComputedDOMStyle::GetStyleContext(Element*aElement,nsIAtom*aPseudo,nsIPresShell*aPresShell,StyleTypeaStyleType){// If the content has a pres shell, we must use it. Otherwise we'd// potentially mix rule trees by using the wrong pres shell's style// set. Using the pres shell from the content also means that any// content that's actually *in* a document will get the style from the// correct document.nsCOMPtr<nsIPresShell>presShell=GetPresShellForContent(aElement);if(!presShell){presShell=aPresShell;if(!presShell)returnnullptr;}presShell->FlushPendingNotifications(FlushType::Style);returnGetStyleContextNoFlush(aElement,aPseudo,presShell,aStyleType);}namespace{classMOZ_STACK_CLASSStyleResolverfinal{public:StyleResolver(nsPresContext*aPresContext,nsComputedDOMStyle::AnimationFlagaAnimationFlag):mAnimationFlag(aAnimationFlag){MOZ_ASSERT(aPresContext);// Nothing to do if we are going to resolve style *with* animation.if(mAnimationFlag==nsComputedDOMStyle::eWithAnimation){return;}// Set SkipAnimationRules flag if we are going to resolve style without// animation.if(aPresContext->RestyleManager()->IsGecko()){mRestyleManager=aPresContext->RestyleManager()->AsGecko();mOldSkipAnimationRules=mRestyleManager->SkipAnimationRules();mRestyleManager->SetSkipAnimationRules(true);}else{NS_WARNING("stylo: can't skip animaition rules yet");}}already_AddRefed<nsStyleContext>ResolveWithAnimation(StyleSetHandleaStyleSet,Element*aElement,CSSPseudoElementTypeaType,nsStyleContext*aParentContext,nsComputedDOMStyle::StyleTypeaStyleType,boolaInDocWithShell){MOZ_ASSERT(mAnimationFlag==nsComputedDOMStyle::eWithAnimation,"AnimationFlag should be eWithAnimation");RefPtr<nsStyleContext>result;if(aType!=CSSPseudoElementType::NotPseudo){nsIFrame*frame=nsLayoutUtils::GetStyleFrame(aElement);Element*pseudoElement=frame&&aInDocWithShell?frame->GetPseudoElement(aType):nullptr;result=aStyleSet->ResolvePseudoElementStyle(aElement,aType,aParentContext,pseudoElement);}else{result=aStyleSet->ResolveStyleFor(aElement,aParentContext,LazyComputeBehavior::Allow);}if(aStyleType==nsComputedDOMStyle::StyleType::eDefaultOnly){// We really only want the user and UA rules. Filter out the other ones.nsTArray<nsCOMPtr<nsIStyleRule>>rules;for(nsRuleNode*ruleNode=result->RuleNode();!ruleNode->IsRoot();ruleNode=ruleNode->GetParent()){if(ruleNode->GetLevel()==SheetType::Agent||ruleNode->GetLevel()==SheetType::User){rules.AppendElement(ruleNode->GetRule());}}// We want to build a list of user/ua rules that is in order from least to// most important, so we have to reverse the list.// Integer division to get "stop" is purposeful here: if length is odd, we// don't have to do anything with the middle element of the array.for(uint32_ti=0,length=rules.Length(),stop=length/2;i<stop;++i){rules[i].swap(rules[length-i-1]);}result=aStyleSet->AsGecko()->ResolveStyleForRules(aParentContext,rules);}returnresult.forget();}already_AddRefed<nsStyleContext>ResolveWithoutAnimation(StyleSetHandleaStyleSet,Element*aElement,CSSPseudoElementTypeaType,nsStyleContext*aParentContext,boolaInDocWithShell){MOZ_ASSERT(!aStyleSet->IsServo(),"Servo backend should not use this function");MOZ_ASSERT(mAnimationFlag==nsComputedDOMStyle::eWithoutAnimation,"AnimationFlag should be eWithoutAnimation");RefPtr<nsStyleContext>result;if(aType!=CSSPseudoElementType::NotPseudo){nsIFrame*frame=nsLayoutUtils::GetStyleFrame(aElement);Element*pseudoElement=frame&&aInDocWithShell?frame->GetPseudoElement(aType):nullptr;result=aStyleSet->AsGecko()->ResolvePseudoElementStyleWithoutAnimation(aElement,aType,aParentContext,pseudoElement);}else{result=aStyleSet->AsGecko()->ResolveStyleWithoutAnimation(aElement,aParentContext);}returnresult.forget();}~StyleResolver(){if(mRestyleManager){mRestyleManager->SetSkipAnimationRules(mOldSkipAnimationRules);}}private:GeckoRestyleManager*mRestyleManager=nullptr;boolmOldSkipAnimationRules=false;nsComputedDOMStyle::AnimationFlagmAnimationFlag;};}/** * The following function checks whether we need to explicitly resolve the style * again, even though we have a style context coming from the frame. * * This basically checks whether the style is or may be under a ::first-line or * ::first-letter frame, in which case we can't return the frame style, and we * need to resolve it. See bug 505515. */staticboolMustReresolveStyle(constnsStyleContext*aContext){MOZ_ASSERT(aContext);if(aContext->HasPseudoElementData()){if(!aContext->GetPseudo()||aContext->IsServo()){// TODO(emilio): When ::first-line is supported in Servo, we may want to// fix this to avoid re-resolving pseudo-element styles.returntrue;}returnaContext->GetParent()&&aContext->GetParent()->HasPseudoElementData();}returnfalse;}already_AddRefed<nsStyleContext>nsComputedDOMStyle::DoGetStyleContextNoFlush(Element*aElement,nsIAtom*aPseudo,nsIPresShell*aPresShell,StyleTypeaStyleType,AnimationFlagaAnimationFlag){MOZ_ASSERT(aElement,"NULL element");// If the content has a pres shell, we must use it. Otherwise we'd// potentially mix rule trees by using the wrong pres shell's style// set. Using the pres shell from the content also means that any// content that's actually *in* a document will get the style from the// correct document.nsIPresShell*presShell=GetPresShellForContent(aElement);boolinDocWithShell=true;if(!presShell){inDocWithShell=false;presShell=aPresShell;if(!presShell)returnnullptr;}autopseudoType=CSSPseudoElementType::NotPseudo;if(aPseudo){pseudoType=nsCSSPseudoElements::GetPseudoType(aPseudo,CSSEnabledState::eIgnoreEnabledState);if(pseudoType>=CSSPseudoElementType::Count){returnnullptr;}}// XXX the !aElement->IsHTMLElement(nsGkAtoms::area)// check is needed due to bug 135040 (to avoid using// mPrimaryFrame). Remove it once that's fixed.if(inDocWithShell&&aStyleType==eAll&&!aElement->IsHTMLElement(nsGkAtoms::area)){nsIFrame*frame=nullptr;if(aPseudo==nsCSSPseudoElements::before){frame=nsLayoutUtils::GetBeforeFrame(aElement);}elseif(aPseudo==nsCSSPseudoElements::after){frame=nsLayoutUtils::GetAfterFrame(aElement);}elseif(!aPseudo){frame=nsLayoutUtils::GetStyleFrame(aElement);}if(frame){nsStyleContext*result=frame->StyleContext();// Don't use the style context if it was influenced by// pseudo-elements, since then it's not the primary style// for this element / pseudo.if(!MustReresolveStyle(result)){// The existing style context may have animation styles so check if we// need to remove them.if(aAnimationFlag==eWithoutAnimation){nsPresContext*presContext=presShell->GetPresContext();MOZ_ASSERT(presContext,"Should have a prescontext if we have a frame");if(presContext&&presContext->StyleSet()->IsGecko()){nsStyleSet*styleSet=presContext->StyleSet()->AsGecko();returnstyleSet->ResolveStyleByRemovingAnimation(aElement,result,eRestyle_AllHintsWithAnimations);}else{RefPtr<ServoComputedValues>baseComputedValues=presContext->StyleSet()->AsServo()->GetBaseComputedValuesForElement(aElement,pseudoType);returnServoStyleContext::Create(nullptr,presContext,aPseudo,pseudoType,baseComputedValues.forget());}}// this function returns an addrefed style contextRefPtr<nsStyleContext>ret=result;returnret.forget();}}}// No frame has been created, or we have a pseudo, or we're looking// for the default style, so resolve the style ourselves.nsPresContext*presContext=presShell->GetPresContext();if(!presContext)returnnullptr;StyleSetHandlestyleSet=presShell->StyleSet();// For Servo, compute the result directly without recursively building up// a throwaway style context chain.if(ServoStyleSet*servoSet=styleSet->GetAsServo()){StyleRuleInclusionrules=aStyleType==eDefaultOnly?StyleRuleInclusion::DefaultOnly:StyleRuleInclusion::All;RefPtr<nsStyleContext>result=servoSet->ResolveTransientStyle(aElement,aPseudo,pseudoType,rules);if(aAnimationFlag==eWithAnimation){returnresult.forget();}RefPtr<ServoComputedValues>baseComputedValues=servoSet->GetBaseComputedValuesForElement(aElement,pseudoType);returnServoStyleContext::Create(nullptr,presContext,aPseudo,pseudoType,baseComputedValues.forget());}RefPtr<nsStyleContext>parentContext;nsIContent*parent=aPseudo?aElement:aElement->GetParent();// Don't resolve parent context for document fragments.if(parent&&parent->IsElement()){parentContext=GetStyleContextNoFlush(parent->AsElement(),nullptr,aPresShell,aStyleType);}StyleResolverstyleResolver(presContext,aAnimationFlag);if(aAnimationFlag==eWithAnimation){returnstyleResolver.ResolveWithAnimation(styleSet,aElement,pseudoType,parentContext,aStyleType,inDocWithShell);}returnstyleResolver.ResolveWithoutAnimation(styleSet,aElement,pseudoType,parentContext,inDocWithShell);}nsMarginnsComputedDOMStyle::GetAdjustedValuesForBoxSizing(){// We want the width/height of whatever parts 'width' or 'height' controls,// which can be different depending on the value of the 'box-sizing' property.constnsStylePosition*stylePos=StylePosition();nsMarginadjustment;if(stylePos->mBoxSizing==StyleBoxSizing::Border){adjustment=mInnerFrame->GetUsedBorderAndPadding();}returnadjustment;}/* static */nsIPresShell*nsComputedDOMStyle::GetPresShellForContent(nsIContent*aContent){nsIDocument*composedDoc=aContent->GetComposedDoc();if(!composedDoc)returnnullptr;returncomposedDoc->GetShell();}// nsDOMCSSDeclaration abstract methods which should never be called// on a nsComputedDOMStyle object, but must be defined to avoid// compile errors.DeclarationBlock*nsComputedDOMStyle::GetCSSDeclaration(Operation){NS_RUNTIMEABORT("called nsComputedDOMStyle::GetCSSDeclaration");returnnullptr;}nsresultnsComputedDOMStyle::SetCSSDeclaration(DeclarationBlock*){NS_RUNTIMEABORT("called nsComputedDOMStyle::SetCSSDeclaration");returnNS_ERROR_FAILURE;}nsIDocument*nsComputedDOMStyle::DocToUpdate(){NS_RUNTIMEABORT("called nsComputedDOMStyle::DocToUpdate");returnnullptr;}voidnsComputedDOMStyle::GetCSSParsingEnvironment(CSSParsingEnvironment&aCSSParseEnv){NS_RUNTIMEABORT("called nsComputedDOMStyle::GetCSSParsingEnvironment");// Just in case NS_RUNTIMEABORT ever stops killing us for some reasonaCSSParseEnv.mPrincipal=nullptr;}nsDOMCSSDeclaration::ServoCSSParsingEnvironmentnsComputedDOMStyle::GetServoCSSParsingEnvironment()const{MOZ_CRASH("called nsComputedDOMStyle::GetServoCSSParsingEnvironment");}voidnsComputedDOMStyle::ClearStyleContext(){if(mResolvedStyleContext){mResolvedStyleContext=false;mContent->RemoveMutationObserver(this);}mStyleContext=nullptr;}voidnsComputedDOMStyle::SetResolvedStyleContext(RefPtr<nsStyleContext>&&aContext){if(!mResolvedStyleContext){mResolvedStyleContext=true;mContent->AddMutationObserver(this);}mStyleContext=aContext;}voidnsComputedDOMStyle::SetFrameStyleContext(nsStyleContext*aContext){ClearStyleContext();mStyleContext=aContext;}voidnsComputedDOMStyle::UpdateCurrentStyleSources(boolaNeedsLayoutFlush){nsCOMPtr<nsIDocument>document=do_QueryReferent(mDocumentWeak);if(!document){ClearStyleContext();return;}// Flush _before_ getting the presshell, since that could create a new// presshell. Also note that we want to flush the style on the document// we're computing style in, not on the document mContent is in -- the two// may be different.document->FlushPendingNotifications(aNeedsLayoutFlush?FlushType::Layout:FlushType::Style);#ifdef DEBUGmFlushedPendingReflows=aNeedsLayoutFlush;#endifmPresShell=document->GetShell();if(!mPresShell||!mPresShell->GetPresContext()){ClearStyleContext();return;}uint64_tcurrentGeneration=mPresShell->GetPresContext()->GetRestyleGeneration();if(mStyleContext){if(mStyleContextGeneration==currentGeneration){// Our cached style context is still valid.return;}// We've processed some restyles, so the cached style context might// be out of date.mStyleContext=nullptr;}// XXX the !mContent->IsHTMLElement(nsGkAtoms::area)// check is needed due to bug 135040 (to avoid using// mPrimaryFrame). Remove it once that's fixed.if(mStyleType==eAll&&!mContent->IsHTMLElement(nsGkAtoms::area)){mOuterFrame=nullptr;if(!mPseudo){mOuterFrame=mContent->GetPrimaryFrame();}elseif(mPseudo==nsCSSPseudoElements::before||mPseudo==nsCSSPseudoElements::after){nsIAtom*property=mPseudo==nsCSSPseudoElements::before?nsGkAtoms::beforePseudoProperty:nsGkAtoms::afterPseudoProperty;auto*pseudo=static_cast<Element*>(mContent->GetProperty(property));mOuterFrame=pseudo?pseudo->GetPrimaryFrame():nullptr;}mInnerFrame=mOuterFrame;if(mOuterFrame){LayoutFrameTypetype=mOuterFrame->Type();if(type==LayoutFrameType::TableWrapper){// If the frame is a table wrapper frame then we should get the style// from the inner table frame.mInnerFrame=mOuterFrame->PrincipalChildList().FirstChild();NS_ASSERTION(mInnerFrame,"table wrapper must have an inner");NS_ASSERTION(!mInnerFrame->GetNextSibling(),"table wrapper frames should have just one child, ""the inner table");}SetFrameStyleContext(mInnerFrame->StyleContext());NS_ASSERTION(mStyleContext,"Frame without style context?");}}if(!mStyleContext||MustReresolveStyle(mStyleContext)){#ifdef DEBUGif(mStyleContext&&mStyleContext->IsGecko()){// We want to check that going through this path because of// HasPseudoElementData is rare, because it slows us down a good// bit. So check that we're really inside something associated// with a pseudo-element that contains elements. (We also allow// the element to be NAC, just in case some chrome JS calls// getComputedStyle on a NAC-implemented pseudo.)nsStyleContext*topWithPseudoElementData=mStyleContext;while(topWithPseudoElementData->GetParent()->HasPseudoElementData()){topWithPseudoElementData=topWithPseudoElementData->GetParent();}CSSPseudoElementTypepseudo=topWithPseudoElementData->GetPseudoType();nsIAtom*pseudoAtom=nsCSSPseudoElements::GetPseudoAtom(pseudo);nsAutoStringassertMsg(NS_LITERAL_STRING("we should be in a pseudo-element that is expected to contain elements ("));assertMsg.Append(nsDependentString(pseudoAtom->GetUTF16String()));assertMsg.Append(')');NS_ASSERTION(nsCSSPseudoElements::PseudoElementContainsElements(pseudo)||mContent->IsNativeAnonymous(),NS_LossyConvertUTF16toASCII(assertMsg).get());}#endif// Need to resolve a style contextRefPtr<nsStyleContext>resolvedStyleContext=nsComputedDOMStyle::GetStyleContext(mContent->AsElement(),mPseudo,mPresShell,mStyleType);if(!resolvedStyleContext){ClearStyleContext();return;}// No need to re-get the generation, even though GetStyleContext// will flush, since we flushed style at the top of this function.NS_ASSERTION(mPresShell&¤tGeneration==mPresShell->GetPresContext()->GetRestyleGeneration(),"why should we have flushed style again?");SetResolvedStyleContext(Move(resolvedStyleContext));NS_ASSERTION(mPseudo||!mStyleContext->HasPseudoElementData(),"should not have pseudo-element data");}if(mAnimationFlag==eWithoutAnimation){// We will support Servo in bug 1311257.MOZ_ASSERT(mPresShell->StyleSet()->IsGecko(),"eWithoutAnimationRules support Gecko only");nsStyleSet*styleSet=mPresShell->StyleSet()->AsGecko();RefPtr<nsStyleContext>unanimatedStyleContext=styleSet->ResolveStyleByRemovingAnimation(mContent->AsElement(),mStyleContext,eRestyle_AllHintsWithAnimations);SetResolvedStyleContext(Move(unanimatedStyleContext));}// mExposeVisitedStyle is set to true only by testing APIs that// require chrome privilege.MOZ_ASSERT(!mExposeVisitedStyle||nsContentUtils::IsCallerChrome(),"mExposeVisitedStyle set incorrectly");if(mExposeVisitedStyle&&mStyleContext->RelevantLinkVisited()){nsStyleContext*styleIfVisited=mStyleContext->GetStyleIfVisited();if(styleIfVisited){mStyleContext=styleIfVisited;}}}voidnsComputedDOMStyle::ClearCurrentStyleSources(){mOuterFrame=nullptr;mInnerFrame=nullptr;mPresShell=nullptr;// Release the current style context if we got it off the frame.// For a style context we resolved, keep it around so that we// can re-use it next time this object is queried.if(!mResolvedStyleContext){mStyleContext=nullptr;}}already_AddRefed<CSSValue>nsComputedDOMStyle::GetPropertyCSSValue(constnsAString&aPropertyName,ErrorResult&aRv){nsCSSPropertyIDprop=nsCSSProps::LookupProperty(aPropertyName,CSSEnabledState::eForAllContent);boolneedsLayoutFlush;nsComputedStyleMap::Entry::ComputeMethodgetter;if(prop==eCSSPropertyExtra_variable){needsLayoutFlush=false;getter=nullptr;}else{// We don't (for now, anyway, though it may make sense to change it// for all aliases, including those in nsCSSPropAliasList) want// aliases to be enumerable (via GetLength and IndexedGetter), so// handle them here rather than adding entries to// GetQueryablePropertyMap.if(prop!=eCSSProperty_UNKNOWN&&nsCSSProps::PropHasFlags(prop,CSS_PROPERTY_IS_ALIAS)){constnsCSSPropertyID*subprops=nsCSSProps::SubpropertyEntryFor(prop);MOZ_ASSERT(subprops[1]==eCSSProperty_UNKNOWN,"must have list of length 1");prop=subprops[0];}constnsComputedStyleMap::Entry*propEntry=GetComputedStyleMap()->FindEntryForProperty(prop);if(!propEntry){#ifdef DEBUG_ComputedDOMStyleNS_WARNING(PromiseFlatCString(NS_ConvertUTF16toUTF8(aPropertyName)+NS_LITERAL_CSTRING(" is not queryable!")).get());#endif// NOTE: For branches, we should flush here for compatibility!returnnullptr;}needsLayoutFlush=propEntry->IsLayoutFlushNeeded();getter=propEntry->mGetter;}UpdateCurrentStyleSources(needsLayoutFlush);if(!mStyleContext){aRv.Throw(NS_ERROR_NOT_AVAILABLE);returnnullptr;}RefPtr<CSSValue>val;if(prop==eCSSPropertyExtra_variable){val=DoGetCustomProperty(aPropertyName);}else{// Call our pointer-to-member-function.val=(this->*getter)();}ClearCurrentStyleSources();returnval.forget();}NS_IMETHODIMPnsComputedDOMStyle::RemoveProperty(constnsAString&aPropertyName,nsAString&aReturn){returnNS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR;}NS_IMETHODIMPnsComputedDOMStyle::GetPropertyPriority(constnsAString&aPropertyName,nsAString&aReturn){aReturn.Truncate();returnNS_OK;}NS_IMETHODIMPnsComputedDOMStyle::SetProperty(constnsAString&aPropertyName,constnsAString&aValue,constnsAString&aPriority){returnNS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR;}NS_IMETHODIMPnsComputedDOMStyle::Item(uint32_taIndex,nsAString&aReturn){returnnsDOMCSSDeclaration::Item(aIndex,aReturn);}voidnsComputedDOMStyle::IndexedGetter(uint32_taIndex,bool&aFound,nsAString&aPropName){nsComputedStyleMap*map=GetComputedStyleMap();uint32_tlength=map->Length();if(aIndex<length){aFound=true;CopyASCIItoUTF16(nsCSSProps::GetStringValue(map->PropertyAt(aIndex)),aPropName);return;}// Custom properties are exposed with indexed properties just after all// of the built-in properties.UpdateCurrentStyleSources(false);if(!mStyleContext){aFound=false;return;}boolisServo=mStyleContext->IsServo();constnsStyleVariables*variables=isServo?nullptr:StyleVariables();constuint32_tcount=isServo?Servo_GetCustomPropertiesCount(mStyleContext->ComputedValues()):variables->mVariables.Count();constuint32_tindex=aIndex-length;if(index<count){aFound=true;nsStringvarName;if(isServo){Servo_GetCustomPropertyNameAt(mStyleContext->ComputedValues(),index,&varName);}else{variables->mVariables.GetVariableAt(index,varName);}aPropName.AssignLiteral("--");aPropName.Append(varName);}else{aFound=false;}ClearCurrentStyleSources();}// Property getters...already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBinding(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleDisplay*display=StyleDisplay();if(display->mBinding){val->SetURI(display->mBinding->GetURI());}else{val->SetIdent(eCSSKeyword_none);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetClear(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mBreakType,nsCSSProps::kClearKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFloat(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mFloat,nsCSSProps::kFloatKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBottom(){returnGetOffsetWidthFor(eSideBottom);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStackSizing(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleXUL()->mStackSizing,nsCSSProps::kStackSizingKTable));returnval.forget();}voidnsComputedDOMStyle::SetToRGBAColor(nsROCSSPrimitiveValue*aValue,nscoloraColor){nsROCSSPrimitiveValue*red=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*green=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*blue=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*alpha=newnsROCSSPrimitiveValue;uint8_ta=NS_GET_A(aColor);nsDOMCSSRGBColor*rgbColor=newnsDOMCSSRGBColor(red,green,blue,alpha,a<255);red->SetNumber(NS_GET_R(aColor));green->SetNumber(NS_GET_G(aColor));blue->SetNumber(NS_GET_B(aColor));alpha->SetNumber(nsStyleUtil::ColorComponentToFloat(a));aValue->SetColor(rgbColor);}voidnsComputedDOMStyle::SetValueFromComplexColor(nsROCSSPrimitiveValue*aValue,constStyleComplexColor&aColor){SetToRGBAColor(aValue,StyleColor()->CalcComplexColor(aColor));}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetToRGBAColor(val,StyleColor()->mColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColorAdjust(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mColorAdjust,nsCSSProps::kColorAdjustKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOpacity(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleEffects()->mOpacity);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColumnCount(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleColumn*column=StyleColumn();if(column->mColumnCount==NS_STYLE_COLUMN_COUNT_AUTO){val->SetIdent(eCSSKeyword_auto);}else{val->SetNumber(column->mColumnCount);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColumnWidth(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;// XXX fix the auto case. When we actually have a column frame, I think// we should return the computed column width.SetValueToCoord(val,StyleColumn()->mColumnWidth,true);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColumnGap(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleColumn*column=StyleColumn();if(column->mColumnGap.GetUnit()==eStyleUnit_Normal){val->SetAppUnits(StyleFont()->mFont.size);}else{SetValueToCoord(val,StyleColumn()->mColumnGap,true);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColumnFill(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleColumn()->mColumnFill,nsCSSProps::kColumnFillKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColumnSpan(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleColumn()->mColumnSpan,nsCSSProps::kColumnSpanKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColumnRuleWidth(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetAppUnits(StyleColumn()->GetComputedColumnRuleWidth());returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColumnRuleStyle(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleColumn()->mColumnRuleStyle,nsCSSProps::kBorderStyleKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColumnRuleColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleColumn()->mColumnRuleColor);returnval.forget();}staticvoidAppendCounterStyle(CounterStyle*aStyle,nsAString&aString){AnonymousCounterStyle*anonymous=aStyle->AsAnonymous();if(!anonymous){// want SetIdentnsStringtype;aStyle->GetStyleName(type);nsStyleUtil::AppendEscapedCSSIdent(type,aString);}elseif(anonymous->IsSingleString()){constnsTArray<nsString>&symbols=anonymous->GetSymbols();MOZ_ASSERT(symbols.Length()==1);nsStyleUtil::AppendEscapedCSSString(symbols[0],aString);}else{aString.AppendLiteral("symbols(");uint8_tsystem=anonymous->GetSystem();NS_ASSERTION(system==NS_STYLE_COUNTER_SYSTEM_CYCLIC||system==NS_STYLE_COUNTER_SYSTEM_NUMERIC||system==NS_STYLE_COUNTER_SYSTEM_ALPHABETIC||system==NS_STYLE_COUNTER_SYSTEM_SYMBOLIC||system==NS_STYLE_COUNTER_SYSTEM_FIXED,"Invalid system for anonymous counter style.");if(system!=NS_STYLE_COUNTER_SYSTEM_SYMBOLIC){AppendASCIItoUTF16(nsCSSProps::ValueToKeyword(system,nsCSSProps::kCounterSystemKTable),aString);aString.Append(' ');}constnsTArray<nsString>&symbols=anonymous->GetSymbols();NS_ASSERTION(symbols.Length()>0,"No symbols in the anonymous counter style");for(size_ti=0,iend=symbols.Length();i<iend;i++){nsStyleUtil::AppendEscapedCSSString(symbols[i],aString);aString.Append(' ');}aString.Replace(aString.Length()-1,1,char16_t(')'));}}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetContent(){constnsStyleContent*content=StyleContent();if(content->ContentCount()==0){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}if(content->ContentCount()==1&&content->ContentAt(0).GetType()==eStyleContentType_AltContent){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword__moz_alt_content);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);for(uint32_ti=0,i_end=content->ContentCount();i<i_end;++i){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleContentData&data=content->ContentAt(i);nsStyleContentTypetype=data.GetType();switch(type){caseeStyleContentType_String:{nsAutoStringstr;nsStyleUtil::AppendEscapedCSSString(nsDependentString(data.GetString()),str);val->SetString(str);break;}caseeStyleContentType_Image:{nsCOMPtr<nsIURI>uri;if(imgRequestProxy*image=data.GetImage()){image->GetURI(getter_AddRefs(uri));}val->SetURI(uri);break;}caseeStyleContentType_Attr:{nsAutoStringstr;nsStyleUtil::AppendEscapedCSSIdent(nsDependentString(data.GetString()),str);val->SetString(str,nsIDOMCSSPrimitiveValue::CSS_ATTR);break;}caseeStyleContentType_Counter:caseeStyleContentType_Counters:{/* FIXME: counters should really use an object */nsAutoStringstr;if(type==eStyleContentType_Counter){str.AppendLiteral("counter(");}else{str.AppendLiteral("counters(");}nsStyleContentData::CounterFunction*counters=data.GetCounters();nsStyleUtil::AppendEscapedCSSIdent(counters->mIdent,str);if(type==eStyleContentType_Counters){str.AppendLiteral(", ");nsStyleUtil::AppendEscapedCSSString(counters->mSeparator,str);}if(counters->mCounterStyle!=CounterStyleManager::GetDecimalStyle()){str.AppendLiteral(", ");AppendCounterStyle(counters->mCounterStyle,str);}str.Append(char16_t(')'));val->SetString(str,nsIDOMCSSPrimitiveValue::CSS_COUNTER);break;}caseeStyleContentType_OpenQuote:val->SetIdent(eCSSKeyword_open_quote);break;caseeStyleContentType_CloseQuote:val->SetIdent(eCSSKeyword_close_quote);break;caseeStyleContentType_NoOpenQuote:val->SetIdent(eCSSKeyword_no_open_quote);break;caseeStyleContentType_NoCloseQuote:val->SetIdent(eCSSKeyword_no_close_quote);break;caseeStyleContentType_AltContent:default:NS_NOTREACHED("unexpected type");break;}valueList->AppendCSSValue(val.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetCounterIncrement(){constnsStyleContent*content=StyleContent();if(content->CounterIncrementCount()==0){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);for(uint32_ti=0,i_end=content->CounterIncrementCount();i<i_end;++i){RefPtr<nsROCSSPrimitiveValue>name=newnsROCSSPrimitiveValue;RefPtr<nsROCSSPrimitiveValue>value=newnsROCSSPrimitiveValue;constnsStyleCounterData&data=content->CounterIncrementAt(i);nsAutoStringescaped;nsStyleUtil::AppendEscapedCSSIdent(data.mCounter,escaped);name->SetString(escaped);value->SetNumber(data.mValue);// XXX This should really be integervalueList->AppendCSSValue(name.forget());valueList->AppendCSSValue(value.forget());}returnvalueList.forget();}/* Convert the stored representation into a list of two values and then hand * it back. */already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTransformOrigin(){/* We need to build up a list of two values. We'll call them * width and height. *//* Store things as a value list */RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);/* Now, get the values. */constnsStyleDisplay*display=StyleDisplay();RefPtr<nsROCSSPrimitiveValue>width=newnsROCSSPrimitiveValue;SetValueToCoord(width,display->mTransformOrigin[0],false,&nsComputedDOMStyle::GetFrameBoundsWidthForTransform);valueList->AppendCSSValue(width.forget());RefPtr<nsROCSSPrimitiveValue>height=newnsROCSSPrimitiveValue;SetValueToCoord(height,display->mTransformOrigin[1],false,&nsComputedDOMStyle::GetFrameBoundsHeightForTransform);valueList->AppendCSSValue(height.forget());if(display->mTransformOrigin[2].GetUnit()!=eStyleUnit_Coord||display->mTransformOrigin[2].GetCoordValue()!=0){RefPtr<nsROCSSPrimitiveValue>depth=newnsROCSSPrimitiveValue;SetValueToCoord(depth,display->mTransformOrigin[2],false,nullptr);valueList->AppendCSSValue(depth.forget());}returnvalueList.forget();}/* Convert the stored representation into a list of two values and then hand * it back. */already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPerspectiveOrigin(){/* We need to build up a list of two values. We'll call them * width and height. *//* Store things as a value list */RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);/* Now, get the values. */constnsStyleDisplay*display=StyleDisplay();RefPtr<nsROCSSPrimitiveValue>width=newnsROCSSPrimitiveValue;SetValueToCoord(width,display->mPerspectiveOrigin[0],false,&nsComputedDOMStyle::GetFrameBoundsWidthForTransform);valueList->AppendCSSValue(width.forget());RefPtr<nsROCSSPrimitiveValue>height=newnsROCSSPrimitiveValue;SetValueToCoord(height,display->mPerspectiveOrigin[1],false,&nsComputedDOMStyle::GetFrameBoundsHeightForTransform);valueList->AppendCSSValue(height.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPerspective(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StyleDisplay()->mChildPerspective,false);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackfaceVisibility(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mBackfaceVisibility,nsCSSProps::kBackfaceVisibilityKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTransformStyle(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mTransformStyle,nsCSSProps::kTransformStyleKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTransform(){constnsStyleDisplay*display=StyleDisplay();returnGetTransformValue(display->mSpecifiedTransform);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTransformBox(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mTransformBox,nsCSSProps::kTransformBoxKTable));returnval.forget();}/* static */already_AddRefed<nsROCSSPrimitiveValue>nsComputedDOMStyle::MatrixToCSSValue(constmozilla::gfx::Matrix4x4&matrix){boolis3D=!matrix.Is2D();nsAutoStringresultString(NS_LITERAL_STRING("matrix"));if(is3D){resultString.AppendLiteral("3d");}resultString.Append('(');resultString.AppendFloat(matrix._11);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._12);resultString.AppendLiteral(", ");if(is3D){resultString.AppendFloat(matrix._13);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._14);resultString.AppendLiteral(", ");}resultString.AppendFloat(matrix._21);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._22);resultString.AppendLiteral(", ");if(is3D){resultString.AppendFloat(matrix._23);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._24);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._31);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._32);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._33);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._34);resultString.AppendLiteral(", ");}resultString.AppendFloat(matrix._41);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._42);if(is3D){resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._43);resultString.AppendLiteral(", ");resultString.AppendFloat(matrix._44);}resultString.Append(')');/* Create a value to hold our result. */RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetString(resultString);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetCounterReset(){constnsStyleContent*content=StyleContent();if(content->CounterResetCount()==0){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);for(uint32_ti=0,i_end=content->CounterResetCount();i<i_end;++i){RefPtr<nsROCSSPrimitiveValue>name=newnsROCSSPrimitiveValue;RefPtr<nsROCSSPrimitiveValue>value=newnsROCSSPrimitiveValue;constnsStyleCounterData&data=content->CounterResetAt(i);nsAutoStringescaped;nsStyleUtil::AppendEscapedCSSIdent(data.mCounter,escaped);name->SetString(escaped);value->SetNumber(data.mValue);// XXX This should really be integervalueList->AppendCSSValue(name.forget());valueList->AppendCSSValue(value.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetQuotes(){constauto"ePairs=StyleList()->GetQuotePairs();if(quotePairs.IsEmpty()){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);for(constauto"ePair:quotePairs){RefPtr<nsROCSSPrimitiveValue>openVal=newnsROCSSPrimitiveValue;RefPtr<nsROCSSPrimitiveValue>closeVal=newnsROCSSPrimitiveValue;nsAutoStrings;nsStyleUtil::AppendEscapedCSSString(quotePair.first,s);openVal->SetString(s);s.Truncate();nsStyleUtil::AppendEscapedCSSString(quotePair.second,s);closeVal->SetString(s);valueList->AppendCSSValue(openVal.forget());valueList->AppendCSSValue(closeVal.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontFamily(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleFont*font=StyleFont();nsAutoStringfontlistStr;nsStyleUtil::AppendEscapedCSSFontFamilyList(font->mFont.fontlist,fontlistStr);val->SetString(fontlistStr);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontSize(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;// Note: StyleFont()->mSize is the 'computed size';// StyleFont()->mFont.size is the 'actual size'val->SetAppUnits(StyleFont()->mSize);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontSizeAdjust(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleFont*font=StyleFont();if(font->mFont.sizeAdjust>=0.0f){val->SetNumber(font->mFont.sizeAdjust);}else{val->SetIdent(eCSSKeyword_none);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOsxFontSmoothing(){if(nsContentUtils::ShouldResistFingerprinting(mPresShell->GetPresContext()->GetDocShell()))returnnullptr;RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleFont()->mFont.smoothing,nsCSSProps::kFontSmoothingKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontStretch(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleFont()->mFont.stretch,nsCSSProps::kFontStretchKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontStyle(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleFont()->mFont.style,nsCSSProps::kFontStyleKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontWeight(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleFont*font=StyleFont();uint16_tweight=font->mFont.weight;NS_ASSERTION(weight%100==0,"unexpected value of font-weight");val->SetNumber(weight);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontFeatureSettings(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleFont*font=StyleFont();if(font->mFont.fontFeatureSettings.IsEmpty()){val->SetIdent(eCSSKeyword_normal);}else{nsAutoStringresult;nsStyleUtil::AppendFontFeatureSettings(font->mFont.fontFeatureSettings,result);val->SetString(result);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontVariationSettings(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleFont*font=StyleFont();if(font->mFont.fontVariationSettings.IsEmpty()){val->SetIdent(eCSSKeyword_normal);}else{nsAutoStringresult;nsStyleUtil::AppendFontVariationSettings(font->mFont.fontVariationSettings,result);val->SetString(result);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontKerning(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleFont()->mFont.kerning,nsCSSProps::kFontKerningKTable));returnval.forget();}staticvoidSerializeLanguageOverride(uint32_taLanguageOverride,nsAString&aResult){aResult.Truncate();uint32_ti;for(i=0;i<4;i++){char16_tch=aLanguageOverride>>24;MOZ_ASSERT(nsCRT::IsAscii(ch),"Invalid tags, we should've handled this during computing!");aResult.Append(ch);aLanguageOverride=aLanguageOverride<<8;}// strip trailing whitespaceswhile(i>0&&aResult[i-1]==' '){i--;}aResult.Truncate(i);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontLanguageOverride(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleFont*font=StyleFont();if(font->mFont.languageOverride==0){val->SetIdent(eCSSKeyword_normal);}else{nsAutoStringserializedStr,escapedStr;SerializeLanguageOverride(font->mFont.languageOverride,serializedStr);nsStyleUtil::AppendEscapedCSSString(serializedStr,escapedStr);val->SetString(escapedStr);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontSynthesis(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleFont()->mFont.synthesis;if(0==intValue){val->SetIdent(eCSSKeyword_none);}else{nsAutoStringvalueStr;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_font_synthesis,intValue,NS_FONT_SYNTHESIS_WEIGHT,NS_FONT_SYNTHESIS_STYLE,valueStr);val->SetString(valueStr);}returnval.forget();}// return a value *only* for valid longhand values from CSS 2.1, either// normal or small-caps onlyalready_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontVariant(){constnsFont&f=StyleFont()->mFont;// if any of the other font-variant subproperties other than// font-variant-caps are not normal then can't calculate a computed valueif(f.variantAlternates||f.variantEastAsian||f.variantLigatures||f.variantNumeric||f.variantPosition){returnnullptr;}nsCSSKeywordkeyword;switch(f.variantCaps){case0:keyword=eCSSKeyword_normal;break;caseNS_FONT_VARIANT_CAPS_SMALLCAPS:keyword=eCSSKeyword_small_caps;break;default:returnnullptr;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(keyword);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontVariantAlternates(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleFont()->mFont.variantAlternates;if(0==intValue){val->SetIdent(eCSSKeyword_normal);returnval.forget();}// first, include enumerated valuesnsAutoStringvalueStr;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_font_variant_alternates,intValue&NS_FONT_VARIANT_ALTERNATES_ENUMERATED_MASK,NS_FONT_VARIANT_ALTERNATES_HISTORICAL,NS_FONT_VARIANT_ALTERNATES_HISTORICAL,valueStr);// next, include functional values if presentif(intValue&NS_FONT_VARIANT_ALTERNATES_FUNCTIONAL_MASK){nsStyleUtil::SerializeFunctionalAlternates(StyleFont()->mFont.alternateValues,valueStr);}val->SetString(valueStr);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontVariantCaps(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleFont()->mFont.variantCaps;if(0==intValue){val->SetIdent(eCSSKeyword_normal);}else{val->SetIdent(nsCSSProps::ValueToKeywordEnum(intValue,nsCSSProps::kFontVariantCapsKTable));}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontVariantEastAsian(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleFont()->mFont.variantEastAsian;if(0==intValue){val->SetIdent(eCSSKeyword_normal);}else{nsAutoStringvalueStr;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_font_variant_east_asian,intValue,NS_FONT_VARIANT_EAST_ASIAN_JIS78,NS_FONT_VARIANT_EAST_ASIAN_RUBY,valueStr);val->SetString(valueStr);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontVariantLigatures(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleFont()->mFont.variantLigatures;if(0==intValue){val->SetIdent(eCSSKeyword_normal);}elseif(NS_FONT_VARIANT_LIGATURES_NONE==intValue){val->SetIdent(eCSSKeyword_none);}else{nsAutoStringvalueStr;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_font_variant_ligatures,intValue,NS_FONT_VARIANT_LIGATURES_NONE,NS_FONT_VARIANT_LIGATURES_NO_CONTEXTUAL,valueStr);val->SetString(valueStr);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontVariantNumeric(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleFont()->mFont.variantNumeric;if(0==intValue){val->SetIdent(eCSSKeyword_normal);}else{nsAutoStringvalueStr;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_font_variant_numeric,intValue,NS_FONT_VARIANT_NUMERIC_LINING,NS_FONT_VARIANT_NUMERIC_ORDINAL,valueStr);val->SetString(valueStr);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFontVariantPosition(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleFont()->mFont.variantPosition;if(0==intValue){val->SetIdent(eCSSKeyword_normal);}else{val->SetIdent(nsCSSProps::ValueToKeywordEnum(intValue,nsCSSProps::kFontVariantPositionKTable));}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundAttachment(){returnGetBackgroundList(&nsStyleImageLayers::Layer::mAttachment,&nsStyleImageLayers::mAttachmentCount,StyleBackground()->mImage,nsCSSProps::kImageLayerAttachmentKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundClip(){returnGetBackgroundList(&nsStyleImageLayers::Layer::mClip,&nsStyleImageLayers::mClipCount,StyleBackground()->mImage,nsCSSProps::kBackgroundClipKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleBackground()->mBackgroundColor);returnval.forget();}staticvoidSetValueToCalc(constnsStyleCoord::CalcValue*aCalc,nsROCSSPrimitiveValue*aValue){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringtmp,result;result.AppendLiteral("calc(");val->SetAppUnits(aCalc->mLength);val->GetCssText(tmp);result.Append(tmp);if(aCalc->mHasPercent){result.AppendLiteral(" + ");val->SetPercent(aCalc->mPercent);val->GetCssText(tmp);result.Append(tmp);}result.Append(')');aValue->SetString(result);// not really SetString}staticvoidAppendCSSGradientLength(constnsStyleCoord&aValue,nsROCSSPrimitiveValue*aPrimitive,nsAString&aString){nsAutoStringtokenString;if(aValue.IsCalcUnit())SetValueToCalc(aValue.GetCalcValue(),aPrimitive);elseif(aValue.GetUnit()==eStyleUnit_Coord)aPrimitive->SetAppUnits(aValue.GetCoordValue());elseaPrimitive->SetPercent(aValue.GetPercentValue());aPrimitive->GetCssText(tokenString);aString.Append(tokenString);}staticvoidAppendCSSGradientToBoxPosition(constnsStyleGradient*aGradient,nsAString&aString,bool&aNeedSep){// This function only supports box position keywords. Make sure we're not// calling it with inputs that would have coordinates that aren't// representable with box-position keywords.MOZ_ASSERT(aGradient->mShape==NS_STYLE_GRADIENT_SHAPE_LINEAR&&!(aGradient->mLegacySyntax&&aGradient->mMozLegacySyntax),"Only call me for linear-gradient and -webkit-linear-gradient");floatxValue=aGradient->mBgPosX.GetPercentValue();floatyValue=aGradient->mBgPosY.GetPercentValue();if(yValue==1.0f&&xValue==0.5f){// omit "to bottom"return;}NS_ASSERTION(yValue!=0.5f||xValue!=0.5f,"invalid box position");if(!aGradient->mLegacySyntax){// Modern syntax explicitly includes the word "to". Old syntax does not// (and is implicitly "from" the given position instead).aString.AppendLiteral("to ");}if(xValue==0.0f){aString.AppendLiteral("left");}elseif(xValue==1.0f){aString.AppendLiteral("right");}elseif(xValue!=0.5f){// do not write "center" keywordNS_NOTREACHED("invalid box position");}if(xValue!=0.5f&&yValue!=0.5f){// We're appending both an x-keyword and a y-keyword.// Add a space between them here.aString.AppendLiteral(" ");}if(yValue==0.0f){aString.AppendLiteral("top");}elseif(yValue==1.0f){aString.AppendLiteral("bottom");}elseif(yValue!=0.5f){// do not write "center" keywordNS_NOTREACHED("invalid box position");}aNeedSep=true;}voidnsComputedDOMStyle::GetCSSGradientString(constnsStyleGradient*aGradient,nsAString&aString){if(!aGradient->mLegacySyntax){aString.Truncate();}else{if(aGradient->mMozLegacySyntax){aString.AssignLiteral("-moz-");}else{aString.AssignLiteral("-webkit-");}}if(aGradient->mRepeating){aString.AppendLiteral("repeating-");}boolisRadial=aGradient->mShape!=NS_STYLE_GRADIENT_SHAPE_LINEAR;if(isRadial){aString.AppendLiteral("radial-gradient(");}else{aString.AppendLiteral("linear-gradient(");}boolneedSep=false;nsAutoStringtokenString;RefPtr<nsROCSSPrimitiveValue>tmpVal=newnsROCSSPrimitiveValue;if(isRadial&&!aGradient->mLegacySyntax){if(aGradient->mSize!=NS_STYLE_GRADIENT_SIZE_EXPLICIT_SIZE){if(aGradient->mShape==NS_STYLE_GRADIENT_SHAPE_CIRCULAR){aString.AppendLiteral("circle");needSep=true;}if(aGradient->mSize!=NS_STYLE_GRADIENT_SIZE_FARTHEST_CORNER){if(needSep){aString.Append(' ');}AppendASCIItoUTF16(nsCSSProps::ValueToKeyword(aGradient->mSize,nsCSSProps::kRadialGradientSizeKTable),aString);needSep=true;}}else{AppendCSSGradientLength(aGradient->mRadiusX,tmpVal,aString);if(aGradient->mShape!=NS_STYLE_GRADIENT_SHAPE_CIRCULAR){aString.Append(' ');AppendCSSGradientLength(aGradient->mRadiusY,tmpVal,aString);}needSep=true;}}if(aGradient->mBgPosX.GetUnit()!=eStyleUnit_None){MOZ_ASSERT(aGradient->mBgPosY.GetUnit()!=eStyleUnit_None);if(!isRadial&&!(aGradient->mLegacySyntax&&aGradient->mMozLegacySyntax)){// linear-gradient() or -webkit-linear-gradient()AppendCSSGradientToBoxPosition(aGradient,aString,needSep);}elseif(aGradient->mBgPosX.GetUnit()!=eStyleUnit_Percent||aGradient->mBgPosX.GetPercentValue()!=0.5f||aGradient->mBgPosY.GetUnit()!=eStyleUnit_Percent||aGradient->mBgPosY.GetPercentValue()!=(isRadial?0.5f:1.0f)){if(isRadial&&!aGradient->mLegacySyntax){if(needSep){aString.Append(' ');}aString.AppendLiteral("at ");needSep=false;}AppendCSSGradientLength(aGradient->mBgPosX,tmpVal,aString);if(aGradient->mBgPosY.GetUnit()!=eStyleUnit_None){aString.Append(' ');AppendCSSGradientLength(aGradient->mBgPosY,tmpVal,aString);}needSep=true;}}if(aGradient->mAngle.GetUnit()!=eStyleUnit_None){MOZ_ASSERT(!isRadial||aGradient->mLegacySyntax);if(needSep){aString.Append(' ');}nsStyleUtil::AppendAngleValue(aGradient->mAngle,aString);needSep=true;}if(isRadial&&aGradient->mLegacySyntax&&(aGradient->mShape==NS_STYLE_GRADIENT_SHAPE_CIRCULAR||aGradient->mSize!=NS_STYLE_GRADIENT_SIZE_FARTHEST_CORNER)){MOZ_ASSERT(aGradient->mSize!=NS_STYLE_GRADIENT_SIZE_EXPLICIT_SIZE);if(needSep){aString.AppendLiteral(", ");needSep=false;}if(aGradient->mShape==NS_STYLE_GRADIENT_SHAPE_CIRCULAR){aString.AppendLiteral("circle");needSep=true;}if(aGradient->mSize!=NS_STYLE_GRADIENT_SIZE_FARTHEST_CORNER){if(needSep){aString.Append(' ');}AppendASCIItoUTF16(nsCSSProps::ValueToKeyword(aGradient->mSize,nsCSSProps::kRadialGradientSizeKTable),aString);}needSep=true;}// color stopsfor(uint32_ti=0;i<aGradient->mStops.Length();++i){if(needSep){aString.AppendLiteral(", ");}constauto&stop=aGradient->mStops[i];if(!stop.mIsInterpolationHint){SetToRGBAColor(tmpVal,stop.mColor);tmpVal->GetCssText(tokenString);aString.Append(tokenString);}if(stop.mLocation.GetUnit()!=eStyleUnit_None){if(!stop.mIsInterpolationHint){aString.Append(' ');}AppendCSSGradientLength(stop.mLocation,tmpVal,aString);}needSep=true;}aString.Append(')');}// -moz-image-rect(<uri>, <top>, <right>, <bottom>, <left>)voidnsComputedDOMStyle::GetImageRectString(nsIURI*aURI,constnsStyleSides&aCropRect,nsString&aString){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);// <uri>RefPtr<nsROCSSPrimitiveValue>valURI=newnsROCSSPrimitiveValue;valURI->SetURI(aURI);valueList->AppendCSSValue(valURI.forget());// <top>, <right>, <bottom>, <left>NS_FOR_CSS_SIDES(side){RefPtr<nsROCSSPrimitiveValue>valSide=newnsROCSSPrimitiveValue;SetValueToCoord(valSide,aCropRect.Get(side),false);valueList->AppendCSSValue(valSide.forget());}nsAutoStringargumentString;valueList->GetCssText(argumentString);aString=NS_LITERAL_STRING("-moz-image-rect(")+argumentString+NS_LITERAL_STRING(")");}voidnsComputedDOMStyle::SetValueToStyleImage(constnsStyleImage&aStyleImage,nsROCSSPrimitiveValue*aValue){switch(aStyleImage.GetType()){caseeStyleImageType_Image:{nsCOMPtr<nsIURI>uri=aStyleImage.GetImageURI();if(!uri){aValue->SetIdent(eCSSKeyword_none);break;}constUniquePtr<nsStyleSides>&cropRect=aStyleImage.GetCropRect();if(cropRect){nsAutoStringimageRectString;GetImageRectString(uri,*cropRect,imageRectString);aValue->SetString(imageRectString);}else{aValue->SetURI(uri);}break;}caseeStyleImageType_Gradient:{nsAutoStringgradientString;GetCSSGradientString(aStyleImage.GetGradientData(),gradientString);aValue->SetString(gradientString);break;}caseeStyleImageType_Element:{nsAutoStringelementId;nsStyleUtil::AppendEscapedCSSIdent(nsDependentAtomString(aStyleImage.GetElementId()),elementId);nsAutoStringelementString=NS_LITERAL_STRING("-moz-element(#")+elementId+NS_LITERAL_STRING(")");aValue->SetString(elementString);break;}caseeStyleImageType_Null:aValue->SetIdent(eCSSKeyword_none);break;caseeStyleImageType_URL:SetValueToURLValue(aStyleImage.GetURLValue(),aValue);break;default:NS_NOTREACHED("unexpected image type");break;}}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageLayerImage(constnsStyleImageLayers&aLayers){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(uint32_ti=0,i_end=aLayers.mImageCount;i<i_end;++i){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToStyleImage(aLayers.mLayers[i].mImage,val);valueList->AppendCSSValue(val.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageLayerPosition(constnsStyleImageLayers&aLayers){if(aLayers.mPositionXCount!=aLayers.mPositionYCount){// No value to return. We can't express this combination of// values as a shorthand.returnnullptr;}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(uint32_ti=0,i_end=aLayers.mPositionXCount;i<i_end;++i){RefPtr<nsDOMCSSValueList>itemList=GetROCSSValueList(false);SetValueToPosition(aLayers.mLayers[i].mPosition,itemList);valueList->AppendCSSValue(itemList.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageLayerPositionX(constnsStyleImageLayers&aLayers){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(uint32_ti=0,i_end=aLayers.mPositionXCount;i<i_end;++i){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToPositionCoord(aLayers.mLayers[i].mPosition.mXPosition,val);valueList->AppendCSSValue(val.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageLayerPositionY(constnsStyleImageLayers&aLayers){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(uint32_ti=0,i_end=aLayers.mPositionYCount;i<i_end;++i){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToPositionCoord(aLayers.mLayers[i].mPosition.mYPosition,val);valueList->AppendCSSValue(val.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageLayerRepeat(constnsStyleImageLayers&aLayers){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(uint32_ti=0,i_end=aLayers.mRepeatCount;i<i_end;++i){RefPtr<nsDOMCSSValueList>itemList=GetROCSSValueList(false);RefPtr<nsROCSSPrimitiveValue>valX=newnsROCSSPrimitiveValue;constStyleImageLayerRepeatxRepeat=aLayers.mLayers[i].mRepeat.mXRepeat;constStyleImageLayerRepeatyRepeat=aLayers.mLayers[i].mRepeat.mYRepeat;boolhasContraction=true;unsignedcontraction;if(xRepeat==yRepeat){contraction=uint8_t(xRepeat);}elseif(xRepeat==StyleImageLayerRepeat::Repeat&&yRepeat==StyleImageLayerRepeat::NoRepeat){contraction=uint8_t(StyleImageLayerRepeat::RepeatX);}elseif(xRepeat==StyleImageLayerRepeat::NoRepeat&&yRepeat==StyleImageLayerRepeat::Repeat){contraction=uint8_t(StyleImageLayerRepeat::RepeatY);}else{hasContraction=false;}RefPtr<nsROCSSPrimitiveValue>valY;if(hasContraction){valX->SetIdent(nsCSSProps::ValueToKeywordEnum(contraction,nsCSSProps::kImageLayerRepeatKTable));}else{valY=newnsROCSSPrimitiveValue;valX->SetIdent(nsCSSProps::ValueToKeywordEnum(xRepeat,nsCSSProps::kImageLayerRepeatKTable));valY->SetIdent(nsCSSProps::ValueToKeywordEnum(yRepeat,nsCSSProps::kImageLayerRepeatKTable));}itemList->AppendCSSValue(valX.forget());if(valY){itemList->AppendCSSValue(valY.forget());}valueList->AppendCSSValue(itemList.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageLayerSize(constnsStyleImageLayers&aLayers){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(uint32_ti=0,i_end=aLayers.mSizeCount;i<i_end;++i){constnsStyleImageLayers::Size&size=aLayers.mLayers[i].mSize;switch(size.mWidthType){casensStyleImageLayers::Size::eContain:casensStyleImageLayers::Size::eCover:{MOZ_ASSERT(size.mWidthType==size.mHeightType,"unsynced types");nsCSSKeywordkeyword=size.mWidthType==nsStyleImageLayers::Size::eContain?eCSSKeyword_contain:eCSSKeyword_cover;RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(keyword);valueList->AppendCSSValue(val.forget());break;}default:{RefPtr<nsDOMCSSValueList>itemList=GetROCSSValueList(false);RefPtr<nsROCSSPrimitiveValue>valX=newnsROCSSPrimitiveValue;RefPtr<nsROCSSPrimitiveValue>valY=newnsROCSSPrimitiveValue;if(size.mWidthType==nsStyleImageLayers::Size::eAuto){valX->SetIdent(eCSSKeyword_auto);}else{MOZ_ASSERT(size.mWidthType==nsStyleImageLayers::Size::eLengthPercentage,"bad mWidthType");if(!size.mWidth.mHasPercent&&// negative values must have come from calc()size.mWidth.mLength>=0){MOZ_ASSERT(size.mWidth.mPercent==0.0f,"Shouldn't have mPercent");valX->SetAppUnits(size.mWidth.mLength);}elseif(size.mWidth.mLength==0&&// negative values must have come from calc()size.mWidth.mPercent>=0.0f){valX->SetPercent(size.mWidth.mPercent);}else{SetValueToCalc(&size.mWidth,valX);}}if(size.mHeightType==nsStyleImageLayers::Size::eAuto){valY->SetIdent(eCSSKeyword_auto);}else{MOZ_ASSERT(size.mHeightType==nsStyleImageLayers::Size::eLengthPercentage,"bad mHeightType");if(!size.mHeight.mHasPercent&&// negative values must have come from calc()size.mHeight.mLength>=0){MOZ_ASSERT(size.mHeight.mPercent==0.0f,"Shouldn't have mPercent");valY->SetAppUnits(size.mHeight.mLength);}elseif(size.mHeight.mLength==0&&// negative values must have come from calc()size.mHeight.mPercent>=0.0f){valY->SetPercent(size.mHeight.mPercent);}else{SetValueToCalc(&size.mHeight,valY);}}itemList->AppendCSSValue(valX.forget());itemList->AppendCSSValue(valY.forget());valueList->AppendCSSValue(itemList.forget());break;}}}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundImage(){constnsStyleImageLayers&layers=StyleBackground()->mImage;returnDoGetImageLayerImage(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundBlendMode(){returnGetBackgroundList(&nsStyleImageLayers::Layer::mBlendMode,&nsStyleImageLayers::mBlendModeCount,StyleBackground()->mImage,nsCSSProps::kBlendModeKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundOrigin(){returnGetBackgroundList(&nsStyleImageLayers::Layer::mOrigin,&nsStyleImageLayers::mOriginCount,StyleBackground()->mImage,nsCSSProps::kBackgroundOriginKTable);}voidnsComputedDOMStyle::SetValueToPositionCoord(constPosition::Coord&aCoord,nsROCSSPrimitiveValue*aValue){if(!aCoord.mHasPercent){MOZ_ASSERT(aCoord.mPercent==0.0f,"Shouldn't have mPercent!");aValue->SetAppUnits(aCoord.mLength);}elseif(aCoord.mLength==0){aValue->SetPercent(aCoord.mPercent);}else{SetValueToCalc(&aCoord,aValue);}}voidnsComputedDOMStyle::SetValueToPosition(constPosition&aPosition,nsDOMCSSValueList*aValueList){RefPtr<nsROCSSPrimitiveValue>valX=newnsROCSSPrimitiveValue;SetValueToPositionCoord(aPosition.mXPosition,valX);aValueList->AppendCSSValue(valX.forget());RefPtr<nsROCSSPrimitiveValue>valY=newnsROCSSPrimitiveValue;SetValueToPositionCoord(aPosition.mYPosition,valY);aValueList->AppendCSSValue(valY.forget());}voidnsComputedDOMStyle::SetValueToURLValue(constcss::URLValueData*aURL,nsROCSSPrimitiveValue*aValue){if(!aURL){aValue->SetIdent(eCSSKeyword_none);return;}// If we have a usable nsIURI in the URLValueData, and the url() wasn't// a fragment-only URL, serialize the nsIURI.if(!aURL->IsLocalRef()){if(nsIURI*uri=aURL->GetURI()){aValue->SetURI(uri);return;}}// Otherwise, serialize the specified URL value.nsAutoStringsource;aURL->GetSourceString(source);nsAutoStringurl;url.AppendLiteral(u"url(");nsStyleUtil::AppendEscapedCSSString(source,url,'"');url.Append(')');aValue->SetString(url);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundPosition(){constnsStyleImageLayers&layers=StyleBackground()->mImage;returnDoGetImageLayerPosition(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundPositionX(){constnsStyleImageLayers&layers=StyleBackground()->mImage;returnDoGetImageLayerPositionX(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundPositionY(){constnsStyleImageLayers&layers=StyleBackground()->mImage;returnDoGetImageLayerPositionY(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundRepeat(){constnsStyleImageLayers&layers=StyleBackground()->mImage;returnDoGetImageLayerRepeat(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBackgroundSize(){constnsStyleImageLayers&layers=StyleBackground()->mImage;returnDoGetImageLayerSize(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridTemplateAreas(){constcss::GridTemplateAreasValue*areas=StylePosition()->mGridTemplateAreas;if(!areas){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}MOZ_ASSERT(!areas->mTemplates.IsEmpty(),"Unexpected empty array in GridTemplateAreasValue");RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);for(uint32_ti=0;i<areas->mTemplates.Length();i++){nsAutoStringstr;nsStyleUtil::AppendEscapedCSSString(areas->mTemplates[i],str);RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetString(str);valueList->AppendCSSValue(val.forget());}returnvalueList.forget();}voidnsComputedDOMStyle::AppendGridLineNames(nsString&aResult,constnsTArray<nsString>&aLineNames){uint32_tnumLines=aLineNames.Length();if(numLines==0){return;}for(uint32_ti=0;;){nsStyleUtil::AppendEscapedCSSIdent(aLineNames[i],aResult);if(++i==numLines){break;}aResult.Append(' ');}}voidnsComputedDOMStyle::AppendGridLineNames(nsDOMCSSValueList*aValueList,constnsTArray<nsString>&aLineNames,boolaSuppressEmptyList){if(aLineNames.IsEmpty()&&aSuppressEmptyList){return;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringlineNamesString;lineNamesString.Assign('[');AppendGridLineNames(lineNamesString,aLineNames);lineNamesString.Append(']');val->SetString(lineNamesString);aValueList->AppendCSSValue(val.forget());}voidnsComputedDOMStyle::AppendGridLineNames(nsDOMCSSValueList*aValueList,constnsTArray<nsString>&aLineNames1,constnsTArray<nsString>&aLineNames2){if(aLineNames1.IsEmpty()&&aLineNames2.IsEmpty()){return;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringlineNamesString;lineNamesString.Assign('[');if(!aLineNames1.IsEmpty()){AppendGridLineNames(lineNamesString,aLineNames1);}if(!aLineNames2.IsEmpty()){if(!aLineNames1.IsEmpty()){lineNamesString.Append(' ');}AppendGridLineNames(lineNamesString,aLineNames2);}lineNamesString.Append(']');val->SetString(lineNamesString);aValueList->AppendCSSValue(val.forget());}already_AddRefed<CSSValue>nsComputedDOMStyle::GetGridTrackSize(constnsStyleCoord&aMinValue,constnsStyleCoord&aMaxValue){if(aMinValue.GetUnit()==eStyleUnit_None){// A fit-content() function.RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringargumentStr,fitContentStr;fitContentStr.AppendLiteral("fit-content(");MOZ_ASSERT(aMaxValue.IsCoordPercentCalcUnit(),"unexpected unit for fit-content() argument value");SetValueToCoord(val,aMaxValue,true);val->GetCssText(argumentStr);fitContentStr.Append(argumentStr);fitContentStr.Append(char16_t(')'));val->SetString(fitContentStr);returnval.forget();}if(aMinValue==aMaxValue){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,aMinValue,true,nullptr,nsCSSProps::kGridTrackBreadthKTable);returnval.forget();}// minmax(auto, <flex>) is equivalent to (and is our internal representation// of) <flex>, and both compute to <flex>if(aMinValue.GetUnit()==eStyleUnit_Auto&&aMaxValue.GetUnit()==eStyleUnit_FlexFraction){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,aMaxValue,true);returnval.forget();}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringargumentStr,minmaxStr;minmaxStr.AppendLiteral("minmax(");SetValueToCoord(val,aMinValue,true,nullptr,nsCSSProps::kGridTrackBreadthKTable);val->GetCssText(argumentStr);minmaxStr.Append(argumentStr);minmaxStr.AppendLiteral(", ");SetValueToCoord(val,aMaxValue,true,nullptr,nsCSSProps::kGridTrackBreadthKTable);val->GetCssText(argumentStr);minmaxStr.Append(argumentStr);minmaxStr.Append(char16_t(')'));val->SetString(minmaxStr);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetGridTemplateColumnsRows(constnsStyleGridTemplate&aTrackList,constComputedGridTrackInfo*aTrackInfo){if(aTrackList.mIsSubgrid){// XXX TODO: add support for repeat(auto-fill) for 'subgrid' (bug 1234311)NS_ASSERTION(aTrackList.mMinTrackSizingFunctions.IsEmpty()&&aTrackList.mMaxTrackSizingFunctions.IsEmpty(),"Unexpected sizing functions with subgrid");RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);RefPtr<nsROCSSPrimitiveValue>subgridKeyword=newnsROCSSPrimitiveValue;subgridKeyword->SetIdent(eCSSKeyword_subgrid);valueList->AppendCSSValue(subgridKeyword.forget());for(uint32_ti=0,len=aTrackList.mLineNameLists.Length();;++i){if(MOZ_UNLIKELY(aTrackList.IsRepeatAutoIndex(i))){MOZ_ASSERT(aTrackList.mIsAutoFill,"subgrid can only have 'auto-fill'");MOZ_ASSERT(aTrackList.mRepeatAutoLineNameListAfter.IsEmpty(),"mRepeatAutoLineNameListAfter isn't used for subgrid");RefPtr<nsROCSSPrimitiveValue>start=newnsROCSSPrimitiveValue;start->SetString(NS_LITERAL_STRING("repeat(auto-fill,"));valueList->AppendCSSValue(start.forget());AppendGridLineNames(valueList,aTrackList.mRepeatAutoLineNameListBefore,/*aSuppressEmptyList*/false);RefPtr<nsROCSSPrimitiveValue>end=newnsROCSSPrimitiveValue;end->SetString(NS_LITERAL_STRING(")"));valueList->AppendCSSValue(end.forget());}if(i==len){break;}AppendGridLineNames(valueList,aTrackList.mLineNameLists[i],/*aSuppressEmptyList*/false);}returnvalueList.forget();}uint32_tnumSizes=aTrackList.mMinTrackSizingFunctions.Length();MOZ_ASSERT(aTrackList.mMaxTrackSizingFunctions.Length()==numSizes,"Different number of min and max track sizing functions");if(aTrackInfo){DebugOnly<bool>isAutoFill=aTrackList.HasRepeatAuto()&&aTrackList.mIsAutoFill;DebugOnly<bool>isAutoFit=aTrackList.HasRepeatAuto()&&!aTrackList.mIsAutoFill;DebugOnly<uint32_t>numExplicitTracks=aTrackInfo->mNumExplicitTracks;MOZ_ASSERT(numExplicitTracks==numSizes||(isAutoFill&&numExplicitTracks>=numSizes)||(isAutoFit&&numExplicitTracks+1>=numSizes),"expected all explicit tracks (or possibly one less, if there's ""an 'auto-fit' track, since that can collapse away)");numSizes=aTrackInfo->mSizes.Length();}// An empty <track-list> without repeats is represented as "none" in syntax.if(numSizes==0&&!aTrackList.HasRepeatAuto()){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);if(aTrackInfo){// We've done layout on the grid and have resolved the sizes of its tracks,// so we'll return those sizes here. The grid spec says we MAY use// repeat(<positive-integer>, Npx) here for consecutive tracks with the same// size, but that doesn't seem worth doing since even for repeat(auto-*)// the resolved size might differ for the repeated tracks.constnsTArray<nscoord>&trackSizes=aTrackInfo->mSizes;constuint32_tnumExplicitTracks=aTrackInfo->mNumExplicitTracks;constuint32_tnumLeadingImplicitTracks=aTrackInfo->mNumLeadingImplicitTracks;MOZ_ASSERT(numSizes>=numLeadingImplicitTracks+numExplicitTracks);// Add any leading implicit tracks.for(uint32_ti=0;i<numLeadingImplicitTracks;++i){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetAppUnits(trackSizes[i]);valueList->AppendCSSValue(val.forget());}// Then add any explicit tracks and removed auto-fit tracks.if(numExplicitTracks||aTrackList.HasRepeatAuto()){int32_tendOfRepeat=0;// first index after any repeat() tracksint32_toffsetToLastRepeat=0;if(aTrackList.HasRepeatAuto()){// offsetToLastRepeat is -1 if all repeat(auto-fit) tracks are emptyoffsetToLastRepeat=numExplicitTracks+1-aTrackList.mLineNameLists.Length();endOfRepeat=aTrackList.mRepeatAutoIndex+offsetToLastRepeat+1;}uint32_trepeatIndex=0;uint32_tnumRepeatTracks=aTrackInfo->mRemovedRepeatTracks.Length();enumLinePlacement{LinesPrecede,LinesFollow,LinesBetween};autoAppendRemovedAutoFits=[this,aTrackInfo,&valueList,aTrackList,&repeatIndex,numRepeatTracks](LinePlacementaPlacement){// Add in removed auto-fit tracks and lines here, if necessaryboolatLeastOneTrackReported=false;while(repeatIndex<numRepeatTracks&&aTrackInfo->mRemovedRepeatTracks[repeatIndex]){if((aPlacement==LinesPrecede)||((aPlacement==LinesBetween)&&atLeastOneTrackReported)){// Precede it with the lines between repeats.AppendGridLineNames(valueList,aTrackList.mRepeatAutoLineNameListAfter,aTrackList.mRepeatAutoLineNameListBefore);}// Removed 'auto-fit' tracks are reported as 0px.RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetAppUnits(0);valueList->AppendCSSValue(val.forget());atLeastOneTrackReported=true;if(aPlacement==LinesFollow){// Follow it with the lines between repeats.AppendGridLineNames(valueList,aTrackList.mRepeatAutoLineNameListAfter,aTrackList.mRepeatAutoLineNameListBefore);}repeatIndex++;}repeatIndex++;};for(int32_ti=0;;i++){if(aTrackList.HasRepeatAuto()){if(i==aTrackList.mRepeatAutoIndex){constnsTArray<nsString>&lineNames=aTrackList.mLineNameLists[i];if(i==endOfRepeat){// All auto-fit tracks are empty, but we report them anyway.AppendGridLineNames(valueList,lineNames,aTrackList.mRepeatAutoLineNameListBefore);AppendRemovedAutoFits(LinesBetween);AppendGridLineNames(valueList,aTrackList.mRepeatAutoLineNameListAfter,aTrackList.mLineNameLists[i+1]);}else{AppendGridLineNames(valueList,lineNames,aTrackList.mRepeatAutoLineNameListBefore);AppendRemovedAutoFits(LinesFollow);}}elseif(i==endOfRepeat){// Before appending the last line, finish off any removed auto-fits.AppendRemovedAutoFits(LinesPrecede);constnsTArray<nsString>&lineNames=aTrackList.mLineNameLists[aTrackList.mRepeatAutoIndex+1];AppendGridLineNames(valueList,aTrackList.mRepeatAutoLineNameListAfter,lineNames);}elseif(i>aTrackList.mRepeatAutoIndex&&i<endOfRepeat){AppendGridLineNames(valueList,aTrackList.mRepeatAutoLineNameListAfter,aTrackList.mRepeatAutoLineNameListBefore);AppendRemovedAutoFits(LinesFollow);}else{uint32_tj=i>endOfRepeat?i-offsetToLastRepeat:i;constnsTArray<nsString>&lineNames=aTrackList.mLineNameLists[j];AppendGridLineNames(valueList,lineNames);}}else{constnsTArray<nsString>&lineNames=aTrackList.mLineNameLists[i];AppendGridLineNames(valueList,lineNames);}if(uint32_t(i)==numExplicitTracks){break;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetAppUnits(trackSizes[i+numLeadingImplicitTracks]);valueList->AppendCSSValue(val.forget());}}// Add any trailing implicit tracks.for(uint32_ti=numLeadingImplicitTracks+numExplicitTracks;i<numSizes;++i){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetAppUnits(trackSizes[i]);valueList->AppendCSSValue(val.forget());}}else{// We don't have a frame. So, we'll just return a serialization of// the tracks from the style (without resolved sizes).for(uint32_ti=0;;i++){constnsTArray<nsString>&lineNames=aTrackList.mLineNameLists[i];if(!lineNames.IsEmpty()){AppendGridLineNames(valueList,lineNames);}if(i==numSizes){break;}if(MOZ_UNLIKELY(aTrackList.IsRepeatAutoIndex(i))){RefPtr<nsROCSSPrimitiveValue>start=newnsROCSSPrimitiveValue;start->SetString(aTrackList.mIsAutoFill?NS_LITERAL_STRING("repeat(auto-fill,"):NS_LITERAL_STRING("repeat(auto-fit,"));valueList->AppendCSSValue(start.forget());if(!aTrackList.mRepeatAutoLineNameListBefore.IsEmpty()){AppendGridLineNames(valueList,aTrackList.mRepeatAutoLineNameListBefore);}valueList->AppendCSSValue(GetGridTrackSize(aTrackList.mMinTrackSizingFunctions[i],aTrackList.mMaxTrackSizingFunctions[i]));if(!aTrackList.mRepeatAutoLineNameListAfter.IsEmpty()){AppendGridLineNames(valueList,aTrackList.mRepeatAutoLineNameListAfter);}RefPtr<nsROCSSPrimitiveValue>end=newnsROCSSPrimitiveValue;end->SetString(NS_LITERAL_STRING(")"));valueList->AppendCSSValue(end.forget());}else{valueList->AppendCSSValue(GetGridTrackSize(aTrackList.mMinTrackSizingFunctions[i],aTrackList.mMaxTrackSizingFunctions[i]));}}}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridAutoFlow(){nsAutoStringstr;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_grid_auto_flow,StylePosition()->mGridAutoFlow,NS_STYLE_GRID_AUTO_FLOW_ROW,NS_STYLE_GRID_AUTO_FLOW_DENSE,str);RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetString(str);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridAutoColumns(){returnGetGridTrackSize(StylePosition()->mGridAutoColumnsMin,StylePosition()->mGridAutoColumnsMax);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridAutoRows(){returnGetGridTrackSize(StylePosition()->mGridAutoRowsMin,StylePosition()->mGridAutoRowsMax);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridTemplateColumns(){constComputedGridTrackInfo*info=nullptr;nsGridContainerFrame*gridFrame=nsGridContainerFrame::GetGridFrameWithComputedInfo(mContent->GetPrimaryFrame());if(gridFrame){info=gridFrame->GetComputedTemplateColumns();}returnGetGridTemplateColumnsRows(StylePosition()->mGridTemplateColumns,info);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridTemplateRows(){constComputedGridTrackInfo*info=nullptr;nsGridContainerFrame*gridFrame=nsGridContainerFrame::GetGridFrameWithComputedInfo(mContent->GetPrimaryFrame());if(gridFrame){info=gridFrame->GetComputedTemplateRows();}returnGetGridTemplateColumnsRows(StylePosition()->mGridTemplateRows,info);}already_AddRefed<CSSValue>nsComputedDOMStyle::GetGridLine(constnsStyleGridLine&aGridLine){if(aGridLine.IsAuto()){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_auto);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);if(aGridLine.mHasSpan){RefPtr<nsROCSSPrimitiveValue>span=newnsROCSSPrimitiveValue;span->SetIdent(eCSSKeyword_span);valueList->AppendCSSValue(span.forget());}if(aGridLine.mInteger!=0){RefPtr<nsROCSSPrimitiveValue>integer=newnsROCSSPrimitiveValue;integer->SetNumber(aGridLine.mInteger);valueList->AppendCSSValue(integer.forget());}if(!aGridLine.mLineName.IsEmpty()){RefPtr<nsROCSSPrimitiveValue>lineName=newnsROCSSPrimitiveValue;nsStringescapedLineName;nsStyleUtil::AppendEscapedCSSIdent(aGridLine.mLineName,escapedLineName);lineName->SetString(escapedLineName);valueList->AppendCSSValue(lineName.forget());}NS_ASSERTION(valueList->Length()>0,"Should have appended at least one value");returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridColumnStart(){returnGetGridLine(StylePosition()->mGridColumnStart);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridColumnEnd(){returnGetGridLine(StylePosition()->mGridColumnEnd);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridRowStart(){returnGetGridLine(StylePosition()->mGridRowStart);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridRowEnd(){returnGetGridLine(StylePosition()->mGridRowEnd);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridColumnGap(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StylePosition()->mGridColumnGap,true);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetGridRowGap(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StylePosition()->mGridRowGap,true);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPaddingTop(){returnGetPaddingWidthFor(eSideTop);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPaddingBottom(){returnGetPaddingWidthFor(eSideBottom);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPaddingLeft(){returnGetPaddingWidthFor(eSideLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPaddingRight(){returnGetPaddingWidthFor(eSideRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderCollapse(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleTableBorder()->mBorderCollapse,nsCSSProps::kBorderCollapseKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderSpacing(){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);RefPtr<nsROCSSPrimitiveValue>xSpacing=newnsROCSSPrimitiveValue;RefPtr<nsROCSSPrimitiveValue>ySpacing=newnsROCSSPrimitiveValue;constnsStyleTableBorder*border=StyleTableBorder();xSpacing->SetAppUnits(border->mBorderSpacingCol);ySpacing->SetAppUnits(border->mBorderSpacingRow);valueList->AppendCSSValue(xSpacing.forget());valueList->AppendCSSValue(ySpacing.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetCaptionSide(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleTableBorder()->mCaptionSide,nsCSSProps::kCaptionSideKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetEmptyCells(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleTableBorder()->mEmptyCells,nsCSSProps::kEmptyCellsKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTableLayout(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleTable()->mLayoutStrategy,nsCSSProps::kTableLayoutKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderTopStyle(){returnGetBorderStyleFor(eSideTop);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderBottomStyle(){returnGetBorderStyleFor(eSideBottom);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderLeftStyle(){returnGetBorderStyleFor(eSideLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderRightStyle(){returnGetBorderStyleFor(eSideRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderBottomColors(){returnGetBorderColorsFor(eSideBottom);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderLeftColors(){returnGetBorderColorsFor(eSideLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderRightColors(){returnGetBorderColorsFor(eSideRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderTopColors(){returnGetBorderColorsFor(eSideTop);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderBottomLeftRadius(){returnGetEllipseRadii(StyleBorder()->mBorderRadius,eCornerBottomLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderBottomRightRadius(){returnGetEllipseRadii(StyleBorder()->mBorderRadius,eCornerBottomRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderTopLeftRadius(){returnGetEllipseRadii(StyleBorder()->mBorderRadius,eCornerTopLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderTopRightRadius(){returnGetEllipseRadii(StyleBorder()->mBorderRadius,eCornerTopRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderTopWidth(){returnGetBorderWidthFor(eSideTop);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderBottomWidth(){returnGetBorderWidthFor(eSideBottom);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderLeftWidth(){returnGetBorderWidthFor(eSideLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderRightWidth(){returnGetBorderWidthFor(eSideRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderTopColor(){returnGetBorderColorFor(eSideTop);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderBottomColor(){returnGetBorderColorFor(eSideBottom);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderLeftColor(){returnGetBorderColorFor(eSideLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderRightColor(){returnGetBorderColorFor(eSideRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMarginTopWidth(){returnGetMarginWidthFor(eSideTop);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMarginBottomWidth(){returnGetMarginWidthFor(eSideBottom);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMarginLeftWidth(){returnGetMarginWidthFor(eSideLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMarginRightWidth(){returnGetMarginWidthFor(eSideRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOrient(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mOrient,nsCSSProps::kOrientKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetScrollBehavior(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mScrollBehavior,nsCSSProps::kScrollBehaviorKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetScrollSnapType(){constnsStyleDisplay*display=StyleDisplay();if(display->mScrollSnapTypeX!=display->mScrollSnapTypeY){// No value to return. We can't express this combination of// values as a shorthand.returnnullptr;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mScrollSnapTypeX,nsCSSProps::kScrollSnapTypeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetScrollSnapTypeX(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mScrollSnapTypeX,nsCSSProps::kScrollSnapTypeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetScrollSnapTypeY(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mScrollSnapTypeY,nsCSSProps::kScrollSnapTypeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetScrollSnapPoints(constnsStyleCoord&aCoord){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;if(aCoord.GetUnit()==eStyleUnit_None){val->SetIdent(eCSSKeyword_none);}else{nsAutoStringargumentString;SetCssTextToCoord(argumentString,aCoord);nsAutoStringtmp;tmp.AppendLiteral("repeat(");tmp.Append(argumentString);tmp.Append(')');val->SetString(tmp);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetScrollSnapPointsX(){returnGetScrollSnapPoints(StyleDisplay()->mScrollSnapPointsX);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetScrollSnapPointsY(){returnGetScrollSnapPoints(StyleDisplay()->mScrollSnapPointsY);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetScrollSnapDestination(){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);SetValueToPosition(StyleDisplay()->mScrollSnapDestination,valueList);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetScrollSnapCoordinate(){constnsStyleDisplay*sd=StyleDisplay();if(sd->mScrollSnapCoordinate.IsEmpty()){// Having no snap coordinates is interpreted as "none"RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}else{RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(size_ti=0,i_end=sd->mScrollSnapCoordinate.Length();i<i_end;++i){RefPtr<nsDOMCSSValueList>itemList=GetROCSSValueList(false);SetValueToPosition(sd->mScrollSnapCoordinate[i],itemList);valueList->AppendCSSValue(itemList.forget());}returnvalueList.forget();}}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOutlineWidth(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleOutline*outline=StyleOutline();nscoordwidth;if(outline->mOutlineStyle==NS_STYLE_BORDER_STYLE_NONE){NS_ASSERTION(outline->GetOutlineWidth()==0,"unexpected width");width=0;}else{width=outline->GetOutlineWidth();}val->SetAppUnits(width);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOutlineStyle(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleOutline()->mOutlineStyle,nsCSSProps::kOutlineStyleKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOutlineOffset(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetAppUnits(StyleOutline()->mOutlineOffset);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOutlineRadiusBottomLeft(){returnGetEllipseRadii(StyleOutline()->mOutlineRadius,eCornerBottomLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOutlineRadiusBottomRight(){returnGetEllipseRadii(StyleOutline()->mOutlineRadius,eCornerBottomRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOutlineRadiusTopLeft(){returnGetEllipseRadii(StyleOutline()->mOutlineRadius,eCornerTopLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOutlineRadiusTopRight(){returnGetEllipseRadii(StyleOutline()->mOutlineRadius,eCornerTopRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOutlineColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleOutline()->mOutlineColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetEllipseRadii(constnsStyleCorners&aRadius,CorneraFullCorner){nsStyleCoordradiusX=aRadius.Get(FullToHalfCorner(aFullCorner,false));nsStyleCoordradiusY=aRadius.Get(FullToHalfCorner(aFullCorner,true));// for compatibility, return a single value if X and Y are equalif(radiusX==radiusY){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,radiusX,true);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);RefPtr<nsROCSSPrimitiveValue>valX=newnsROCSSPrimitiveValue;RefPtr<nsROCSSPrimitiveValue>valY=newnsROCSSPrimitiveValue;SetValueToCoord(valX,radiusX,true);SetValueToCoord(valY,radiusY,true);valueList->AppendCSSValue(valX.forget());valueList->AppendCSSValue(valY.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetCSSShadowArray(nsCSSShadowArray*aArray,constnscolor&aDefaultColor,boolaIsBoxShadow){if(!aArray){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}staticnscoordnsCSSShadowItem::*constshadowValuesNoSpread[]={&nsCSSShadowItem::mXOffset,&nsCSSShadowItem::mYOffset,&nsCSSShadowItem::mRadius};staticnscoordnsCSSShadowItem::*constshadowValuesWithSpread[]={&nsCSSShadowItem::mXOffset,&nsCSSShadowItem::mYOffset,&nsCSSShadowItem::mRadius,&nsCSSShadowItem::mSpread};nscoordnsCSSShadowItem::*const*shadowValues;uint32_tshadowValuesLength;if(aIsBoxShadow){shadowValues=shadowValuesWithSpread;shadowValuesLength=ArrayLength(shadowValuesWithSpread);}else{shadowValues=shadowValuesNoSpread;shadowValuesLength=ArrayLength(shadowValuesNoSpread);}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(nsCSSShadowItem*item=aArray->ShadowAt(0),*item_end=item+aArray->Length();item<item_end;++item){RefPtr<nsDOMCSSValueList>itemList=GetROCSSValueList(false);// Color is either the specified shadow color or the foreground colorRefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nscolorshadowColor;if(item->mHasColor){shadowColor=item->mColor;}else{shadowColor=aDefaultColor;}SetToRGBAColor(val,shadowColor);itemList->AppendCSSValue(val.forget());// Set the offsets, blur radius, and spread if availablefor(uint32_ti=0;i<shadowValuesLength;++i){val=newnsROCSSPrimitiveValue;val->SetAppUnits(item->*(shadowValues[i]));itemList->AppendCSSValue(val.forget());}if(item->mInset&&aIsBoxShadow){// This is an inset box-shadowval=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(uint8_t(StyleBoxShadowType::Inset),nsCSSProps::kBoxShadowTypeKTable));itemList->AppendCSSValue(val.forget());}valueList->AppendCSSValue(itemList.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxDecorationBreak(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleBorder()->mBoxDecorationBreak,nsCSSProps::kBoxDecorationBreakKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxShadow(){returnGetCSSShadowArray(StyleEffects()->mBoxShadow,StyleColor()->mColor,true);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetZIndex(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StylePosition()->mZIndex,false);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetListStyleImage(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsCOMPtr<nsIURI>uri=StyleList()->GetListStyleImageURI();if(!uri){val->SetIdent(eCSSKeyword_none);}else{val->SetURI(uri);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetListStylePosition(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleList()->mListStylePosition,nsCSSProps::kListStylePositionKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetListStyleType(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringtmp;AppendCounterStyle(StyleList()->mCounterStyle,tmp);val->SetString(tmp);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageRegion(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleList*list=StyleList();if(list->mImageRegion.width<=0||list->mImageRegion.height<=0){val->SetIdent(eCSSKeyword_auto);}else{// create the cssvalues for the sides, stick them in the rect objectnsROCSSPrimitiveValue*topVal=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*rightVal=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*bottomVal=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*leftVal=newnsROCSSPrimitiveValue;nsDOMCSSRect*domRect=newnsDOMCSSRect(topVal,rightVal,bottomVal,leftVal);topVal->SetAppUnits(list->mImageRegion.y);rightVal->SetAppUnits(list->mImageRegion.width+list->mImageRegion.x);bottomVal->SetAppUnits(list->mImageRegion.height+list->mImageRegion.y);leftVal->SetAppUnits(list->mImageRegion.x);val->SetRect(domRect);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetInitialLetter(){constnsStyleTextReset*textReset=StyleTextReset();RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;if(textReset->mInitialLetterSink==0){val->SetIdent(eCSSKeyword_normal);returnval.forget();}else{RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);val->SetNumber(textReset->mInitialLetterSize);valueList->AppendCSSValue(val.forget());RefPtr<nsROCSSPrimitiveValue>second=newnsROCSSPrimitiveValue;second->SetNumber(textReset->mInitialLetterSink);valueList->AppendCSSValue(second.forget());returnvalueList.forget();}}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetLineHeight(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nscoordlineHeight;if(GetLineHeightCoord(lineHeight)){val->SetAppUnits(lineHeight);}else{SetValueToCoord(val,StyleText()->mLineHeight,true,nullptr,nsCSSProps::kLineHeightKTable);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetRubyAlign(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mRubyAlign,nsCSSProps::kRubyAlignKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetRubyPosition(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mRubyPosition,nsCSSProps::kRubyPositionKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetVerticalAlign(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StyleDisplay()->mVerticalAlign,false,nullptr,nsCSSProps::kVerticalAlignKTable);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::CreateTextAlignValue(uint8_taAlign,boolaAlignTrue,constKTableEntryaTable[]){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(aAlign,aTable));if(!aAlignTrue){returnval.forget();}RefPtr<nsROCSSPrimitiveValue>first=newnsROCSSPrimitiveValue;first->SetIdent(eCSSKeyword_unsafe);RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);valueList->AppendCSSValue(first.forget());valueList->AppendCSSValue(val.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextAlign(){constnsStyleText*style=StyleText();returnCreateTextAlignValue(style->mTextAlign,style->mTextAlignTrue,nsCSSProps::kTextAlignKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextAlignLast(){constnsStyleText*style=StyleText();returnCreateTextAlignValue(style->mTextAlignLast,style->mTextAlignLastTrue,nsCSSProps::kTextAlignLastKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextCombineUpright(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;uint8_ttch=StyleText()->mTextCombineUpright;if(tch<=NS_STYLE_TEXT_COMBINE_UPRIGHT_ALL){val->SetIdent(nsCSSProps::ValueToKeywordEnum(tch,nsCSSProps::kTextCombineUprightKTable));}elseif(tch<=NS_STYLE_TEXT_COMBINE_UPRIGHT_DIGITS_2){val->SetString(NS_LITERAL_STRING("digits 2"));}elseif(tch<=NS_STYLE_TEXT_COMBINE_UPRIGHT_DIGITS_3){val->SetString(NS_LITERAL_STRING("digits 3"));}else{val->SetString(NS_LITERAL_STRING("digits 4"));}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextDecoration(){constnsStyleTextReset*textReset=StyleTextReset();boolisInitialStyle=textReset->mTextDecorationStyle==NS_STYLE_TEXT_DECORATION_STYLE_SOLID;StyleComplexColorcolor=textReset->mTextDecorationColor;if(isInitialStyle&&color.IsCurrentColor()){returnDoGetTextDecorationLine();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);valueList->AppendCSSValue(DoGetTextDecorationLine());if(!isInitialStyle){valueList->AppendCSSValue(DoGetTextDecorationStyle());}if(!color.IsCurrentColor()){valueList->AppendCSSValue(DoGetTextDecorationColor());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextDecorationColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleTextReset()->mTextDecorationColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextDecorationLine(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleTextReset()->mTextDecorationLine;if(NS_STYLE_TEXT_DECORATION_LINE_NONE==intValue){val->SetIdent(eCSSKeyword_none);}else{nsAutoStringdecorationLineString;// Clear the OVERRIDE_ALL bits -- we don't want these to appear in// the computed style.intValue&=~NS_STYLE_TEXT_DECORATION_LINE_OVERRIDE_ALL;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_text_decoration_line,intValue,NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE,NS_STYLE_TEXT_DECORATION_LINE_BLINK,decorationLineString);val->SetString(decorationLineString);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextDecorationStyle(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleTextReset()->mTextDecorationStyle,nsCSSProps::kTextDecorationStyleKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextEmphasisColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleText()->mTextEmphasisColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextEmphasisPosition(){autoposition=StyleText()->mTextEmphasisPosition;MOZ_ASSERT(!(position&NS_STYLE_TEXT_EMPHASIS_POSITION_OVER)!=!(position&NS_STYLE_TEXT_EMPHASIS_POSITION_UNDER));RefPtr<nsROCSSPrimitiveValue>first=newnsROCSSPrimitiveValue;first->SetIdent((position&NS_STYLE_TEXT_EMPHASIS_POSITION_OVER)?eCSSKeyword_over:eCSSKeyword_under);MOZ_ASSERT(!(position&NS_STYLE_TEXT_EMPHASIS_POSITION_LEFT)!=!(position&NS_STYLE_TEXT_EMPHASIS_POSITION_RIGHT));RefPtr<nsROCSSPrimitiveValue>second=newnsROCSSPrimitiveValue;second->SetIdent((position&NS_STYLE_TEXT_EMPHASIS_POSITION_LEFT)?eCSSKeyword_left:eCSSKeyword_right);RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);valueList->AppendCSSValue(first.forget());valueList->AppendCSSValue(second.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextEmphasisStyle(){autostyle=StyleText()->mTextEmphasisStyle;if(style==NS_STYLE_TEXT_EMPHASIS_STYLE_NONE){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}if(style==NS_STYLE_TEXT_EMPHASIS_STYLE_STRING){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringtmp;nsStyleUtil::AppendEscapedCSSString(StyleText()->mTextEmphasisStyleString,tmp);val->SetString(tmp);returnval.forget();}RefPtr<nsROCSSPrimitiveValue>fillVal=newnsROCSSPrimitiveValue;if((style&NS_STYLE_TEXT_EMPHASIS_STYLE_FILL_MASK)==NS_STYLE_TEXT_EMPHASIS_STYLE_FILLED){fillVal->SetIdent(eCSSKeyword_filled);}else{MOZ_ASSERT((style&NS_STYLE_TEXT_EMPHASIS_STYLE_FILL_MASK)==NS_STYLE_TEXT_EMPHASIS_STYLE_OPEN);fillVal->SetIdent(eCSSKeyword_open);}RefPtr<nsROCSSPrimitiveValue>shapeVal=newnsROCSSPrimitiveValue;shapeVal->SetIdent(nsCSSProps::ValueToKeywordEnum(style&NS_STYLE_TEXT_EMPHASIS_STYLE_SHAPE_MASK,nsCSSProps::kTextEmphasisStyleShapeKTable));RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);valueList->AppendCSSValue(fillVal.forget());valueList->AppendCSSValue(shapeVal.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextIndent(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StyleText()->mTextIndent,false);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextJustify(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mTextJustify,nsCSSProps::kTextJustifyKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextOrientation(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mTextOrientation,nsCSSProps::kTextOrientationKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextOverflow(){constnsStyleTextReset*style=StyleTextReset();RefPtr<nsROCSSPrimitiveValue>first=newnsROCSSPrimitiveValue;constnsStyleTextOverflowSide*side=style->mTextOverflow.GetFirstValue();if(side->mType==NS_STYLE_TEXT_OVERFLOW_STRING){nsAutoStringstr;nsStyleUtil::AppendEscapedCSSString(side->mString,str);first->SetString(str);}else{first->SetIdent(nsCSSProps::ValueToKeywordEnum(side->mType,nsCSSProps::kTextOverflowKTable));}side=style->mTextOverflow.GetSecondValue();if(!side){returnfirst.forget();}RefPtr<nsROCSSPrimitiveValue>second=newnsROCSSPrimitiveValue;if(side->mType==NS_STYLE_TEXT_OVERFLOW_STRING){nsAutoStringstr;nsStyleUtil::AppendEscapedCSSString(side->mString,str);second->SetString(str);}else{second->SetIdent(nsCSSProps::ValueToKeywordEnum(side->mType,nsCSSProps::kTextOverflowKTable));}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);valueList->AppendCSSValue(first.forget());valueList->AppendCSSValue(second.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextShadow(){returnGetCSSShadowArray(StyleText()->mTextShadow,StyleColor()->mColor,false);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextSizeAdjust(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mTextSizeAdjust,nsCSSProps::kTextSizeAdjustKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextTransform(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mTextTransform,nsCSSProps::kTextTransformKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTabSize(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StyleText()->mTabSize,true);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetLetterSpacing(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StyleText()->mLetterSpacing,false);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWordSpacing(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StyleText()->mWordSpacing,false);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWhiteSpace(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mWhiteSpace,nsCSSProps::kWhitespaceKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWindowDragging(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleUIReset()->mWindowDragging,nsCSSProps::kWindowDraggingKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWindowShadow(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleUIReset()->mWindowShadow,nsCSSProps::kWindowShadowKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWindowOpacity(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleUIReset()->mWindowOpacity);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWindowTransform(){constnsStyleUIReset*uiReset=StyleUIReset();returnGetTransformValue(uiReset->mSpecifiedWindowTransform);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWindowTransformOrigin(){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);constnsStyleUIReset*uiReset=StyleUIReset();RefPtr<nsROCSSPrimitiveValue>originX=newnsROCSSPrimitiveValue;SetValueToCoord(originX,uiReset->mWindowTransformOrigin[0],false,&nsComputedDOMStyle::GetFrameBoundsWidthForTransform);valueList->AppendCSSValue(originX.forget());RefPtr<nsROCSSPrimitiveValue>originY=newnsROCSSPrimitiveValue;SetValueToCoord(originY,uiReset->mWindowTransformOrigin[1],false,&nsComputedDOMStyle::GetFrameBoundsHeightForTransform);valueList->AppendCSSValue(originY.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWordBreak(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mWordBreak,nsCSSProps::kWordBreakKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOverflowWrap(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mOverflowWrap,nsCSSProps::kOverflowWrapKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetHyphens(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mHyphens,nsCSSProps::kHyphensKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWebkitTextFillColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleText()->mWebkitTextFillColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWebkitTextStrokeColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleText()->mWebkitTextStrokeColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWebkitTextStrokeWidth(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetAppUnits(StyleText()->mWebkitTextStrokeWidth);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPointerEvents(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleUserInterface()->mPointerEvents,nsCSSProps::kPointerEventsKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetVisibility(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mVisible,nsCSSProps::kVisibilityKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWritingMode(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mWritingMode,nsCSSProps::kWritingModeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetDirection(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mDirection,nsCSSProps::kDirectionKTable));returnval.forget();}static_assert(NS_STYLE_UNICODE_BIDI_NORMAL==0,"unicode-bidi style constants not as expected");already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetUnicodeBidi(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleTextReset()->mUnicodeBidi,nsCSSProps::kUnicodeBidiKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetCaretColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleUserInterface()->mCaretColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetCursor(){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);constnsStyleUserInterface*ui=StyleUserInterface();for(constnsCursorImage&item:ui->mCursorImages){RefPtr<nsDOMCSSValueList>itemList=GetROCSSValueList(false);RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToURLValue(item.mImage->GetImageValue(),val);itemList->AppendCSSValue(val.forget());if(item.mHaveHotspot){RefPtr<nsROCSSPrimitiveValue>valX=newnsROCSSPrimitiveValue;RefPtr<nsROCSSPrimitiveValue>valY=newnsROCSSPrimitiveValue;valX->SetNumber(item.mHotspotX);valY->SetNumber(item.mHotspotY);itemList->AppendCSSValue(valX.forget());itemList->AppendCSSValue(valY.forget());}valueList->AppendCSSValue(itemList.forget());}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(ui->mCursor,nsCSSProps::kCursorKTable));valueList->AppendCSSValue(val.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAppearance(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mAppearance,nsCSSProps::kAppearanceKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxAlign(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleXUL()->mBoxAlign,nsCSSProps::kBoxAlignKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxDirection(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleXUL()->mBoxDirection,nsCSSProps::kBoxDirectionKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxFlex(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleXUL()->mBoxFlex);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxOrdinalGroup(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleXUL()->mBoxOrdinal);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxOrient(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleXUL()->mBoxOrient,nsCSSProps::kBoxOrientKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxPack(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleXUL()->mBoxPack,nsCSSProps::kBoxPackKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBoxSizing(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StylePosition()->mBoxSizing,nsCSSProps::kBoxSizingKTable));returnval.forget();}/* Border image properties */already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderImageSource(){constnsStyleBorder*border=StyleBorder();RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleImage&image=border->mBorderImageSource;SetValueToStyleImage(image,val);returnval.forget();}voidnsComputedDOMStyle::AppendFourSideCoordValues(nsDOMCSSValueList*aList,constnsStyleSides&aValues){constnsStyleCoord&top=aValues.Get(eSideTop);constnsStyleCoord&right=aValues.Get(eSideRight);constnsStyleCoord&bottom=aValues.Get(eSideBottom);constnsStyleCoord&left=aValues.Get(eSideLeft);autoappendValue=[this,aList](constnsStyleCoord&value){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,value,true);aList->AppendCSSValue(val.forget());};appendValue(top);if(top!=right||top!=bottom||top!=left){appendValue(right);if(top!=bottom||right!=left){appendValue(bottom);if(right!=left){appendValue(left);}}}}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderImageSlice(){constnsStyleBorder*border=StyleBorder();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);AppendFourSideCoordValues(valueList,border->mBorderImageSlice);// Fill keyword.if(NS_STYLE_BORDER_IMAGE_SLICE_FILL==border->mBorderImageFill){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_fill);valueList->AppendCSSValue(val.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderImageWidth(){constnsStyleBorder*border=StyleBorder();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);AppendFourSideCoordValues(valueList,border->mBorderImageWidth);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderImageOutset(){constnsStyleBorder*border=StyleBorder();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);AppendFourSideCoordValues(valueList,border->mBorderImageOutset);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetBorderImageRepeat(){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);constnsStyleBorder*border=StyleBorder();// horizontal repeatRefPtr<nsROCSSPrimitiveValue>valX=newnsROCSSPrimitiveValue;valX->SetIdent(nsCSSProps::ValueToKeywordEnum(border->mBorderImageRepeatH,nsCSSProps::kBorderImageRepeatKTable));valueList->AppendCSSValue(valX.forget());// vertical repeatRefPtr<nsROCSSPrimitiveValue>valY=newnsROCSSPrimitiveValue;valY->SetIdent(nsCSSProps::ValueToKeywordEnum(border->mBorderImageRepeatV,nsCSSProps::kBorderImageRepeatKTable));valueList->AppendCSSValue(valY.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFlexBasis(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;// XXXdholbert We could make this more automagic and resolve percentages// if we wanted, by passing in a PercentageBaseGetter instead of nullptr// below. Logic would go like this:// if (i'm a flex item) {// if (my flex container is horizontal) {// percentageBaseGetter = &nsComputedDOMStyle::GetCBContentWidth;// } else {// percentageBaseGetter = &nsComputedDOMStyle::GetCBContentHeight;// }// }SetValueToCoord(val,StylePosition()->mFlexBasis,true,nullptr,nsCSSProps::kWidthKTable);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFlexDirection(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StylePosition()->mFlexDirection,nsCSSProps::kFlexDirectionKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFlexGrow(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StylePosition()->mFlexGrow);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFlexShrink(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StylePosition()->mFlexShrink);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFlexWrap(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StylePosition()->mFlexWrap,nsCSSProps::kFlexWrapKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOrder(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StylePosition()->mOrder);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAlignContent(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringstr;autoalign=StylePosition()->mAlignContent;nsCSSValue::AppendAlignJustifyValueToString(align&NS_STYLE_ALIGN_ALL_BITS,str);autofallback=align>>NS_STYLE_ALIGN_ALL_SHIFT;if(fallback){str.Append(' ');nsCSSValue::AppendAlignJustifyValueToString(fallback,str);}val->SetString(str);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAlignItems(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringstr;autoalign=StylePosition()->mAlignItems;nsCSSValue::AppendAlignJustifyValueToString(align,str);val->SetString(str);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAlignSelf(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringstr;autoalign=StylePosition()->mAlignSelf;nsCSSValue::AppendAlignJustifyValueToString(align,str);val->SetString(str);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetJustifyContent(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringstr;autojustify=StylePosition()->mJustifyContent;nsCSSValue::AppendAlignJustifyValueToString(justify&NS_STYLE_JUSTIFY_ALL_BITS,str);autofallback=justify>>NS_STYLE_JUSTIFY_ALL_SHIFT;if(fallback){MOZ_ASSERT(nsCSSProps::ValueToKeywordEnum(fallback&~NS_STYLE_JUSTIFY_FLAG_BITS,nsCSSProps::kAlignSelfPosition)!=eCSSKeyword_UNKNOWN,"unknown fallback value");str.Append(' ');nsCSSValue::AppendAlignJustifyValueToString(fallback,str);}val->SetString(str);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetJustifyItems(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringstr;autojustify=StylePosition()->ComputedJustifyItems(mStyleContext->GetParentAllowServo());nsCSSValue::AppendAlignJustifyValueToString(justify,str);val->SetString(str);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetJustifySelf(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringstr;autojustify=StylePosition()->mJustifySelf;nsCSSValue::AppendAlignJustifyValueToString(justify,str);val->SetString(str);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFloatEdge(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(uint8_t(StyleBorder()->mFloatEdge),nsCSSProps::kFloatEdgeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetForceBrokenImageIcon(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleUIReset()->mForceBrokenImageIcon);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageOrientation(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringstring;nsStyleImageOrientationorientation=StyleVisibility()->mImageOrientation;if(orientation.IsFromImage()){string.AppendLiteral("from-image");}else{nsStyleUtil::AppendAngleValue(orientation.AngleAsCoord(),string);if(orientation.IsFlipped()){string.AppendLiteral(" flip");}}val->SetString(string);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetIMEMode(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleUIReset()->mIMEMode,nsCSSProps::kIMEModeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetUserFocus(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(uint8_t(StyleUserInterface()->mUserFocus),nsCSSProps::kUserFocusKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetUserInput(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleUserInterface()->mUserInput,nsCSSProps::kUserInputKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetUserModify(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleUserInterface()->mUserModify,nsCSSProps::kUserModifyKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetUserSelect(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleUIReset()->mUserSelect,nsCSSProps::kUserSelectKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetDisplay(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mDisplay,nsCSSProps::kDisplayKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetContain(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tmask=StyleDisplay()->mContain;if(mask==0){val->SetIdent(eCSSKeyword_none);}elseif(mask&NS_STYLE_CONTAIN_STRICT){NS_ASSERTION(mask==(NS_STYLE_CONTAIN_STRICT|NS_STYLE_CONTAIN_ALL_BITS),"contain: strict should imply contain: layout style paint");val->SetIdent(eCSSKeyword_strict);}else{nsAutoStringvalueStr;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_contain,mask,NS_STYLE_CONTAIN_LAYOUT,NS_STYLE_CONTAIN_PAINT,valueStr);val->SetString(valueStr);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPosition(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mPosition,nsCSSProps::kPositionKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetClip(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleEffects*effects=StyleEffects();if(effects->mClipFlags==NS_STYLE_CLIP_AUTO){val->SetIdent(eCSSKeyword_auto);}else{// create the cssvalues for the sides, stick them in the rect objectnsROCSSPrimitiveValue*topVal=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*rightVal=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*bottomVal=newnsROCSSPrimitiveValue;nsROCSSPrimitiveValue*leftVal=newnsROCSSPrimitiveValue;nsDOMCSSRect*domRect=newnsDOMCSSRect(topVal,rightVal,bottomVal,leftVal);if(effects->mClipFlags&NS_STYLE_CLIP_TOP_AUTO){topVal->SetIdent(eCSSKeyword_auto);}else{topVal->SetAppUnits(effects->mClip.y);}if(effects->mClipFlags&NS_STYLE_CLIP_RIGHT_AUTO){rightVal->SetIdent(eCSSKeyword_auto);}else{rightVal->SetAppUnits(effects->mClip.width+effects->mClip.x);}if(effects->mClipFlags&NS_STYLE_CLIP_BOTTOM_AUTO){bottomVal->SetIdent(eCSSKeyword_auto);}else{bottomVal->SetAppUnits(effects->mClip.height+effects->mClip.y);}if(effects->mClipFlags&NS_STYLE_CLIP_LEFT_AUTO){leftVal->SetIdent(eCSSKeyword_auto);}else{leftVal->SetAppUnits(effects->mClip.x);}val->SetRect(domRect);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWillChange(){constnsCOMArray<nsIAtom>&willChange=StyleDisplay()->mWillChange;if(willChange.IsEmpty()){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_auto);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(constnsIAtom*ident:willChange){RefPtr<nsROCSSPrimitiveValue>property=newnsROCSSPrimitiveValue;property->SetString(nsDependentAtomString(ident));valueList->AppendCSSValue(property.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOverflow(){constnsStyleDisplay*display=StyleDisplay();if(display->mOverflowX!=display->mOverflowY){// No value to return. We can't express this combination of// values as a shorthand.returnnullptr;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(display->mOverflowX,nsCSSProps::kOverflowKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOverflowX(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mOverflowX,nsCSSProps::kOverflowSubKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOverflowY(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mOverflowY,nsCSSProps::kOverflowSubKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetOverflowClipBox(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mOverflowClipBox,nsCSSProps::kOverflowClipBoxKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetResize(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mResize,nsCSSProps::kResizeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPageBreakAfter(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleDisplay*display=StyleDisplay();if(display->mBreakAfter){val->SetIdent(eCSSKeyword_always);}else{val->SetIdent(eCSSKeyword_auto);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPageBreakBefore(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleDisplay*display=StyleDisplay();if(display->mBreakBefore){val->SetIdent(eCSSKeyword_always);}else{val->SetIdent(eCSSKeyword_auto);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPageBreakInside(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mBreakInside,nsCSSProps::kPageBreakInsideKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTouchAction(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;int32_tintValue=StyleDisplay()->mTouchAction;// None and Auto and Manipulation values aren't allowed// to be in conjunction with other values.// But there are all checks in CSSParserImpl::ParseTouchActionnsAutoStringvalueStr;nsStyleUtil::AppendBitmaskCSSValue(eCSSProperty_touch_action,intValue,NS_STYLE_TOUCH_ACTION_NONE,NS_STYLE_TOUCH_ACTION_MANIPULATION,valueStr);val->SetString(valueStr);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetHeight(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;boolcalcHeight=false;if(mInnerFrame){calcHeight=true;constnsStyleDisplay*displayData=StyleDisplay();if(displayData->mDisplay==mozilla::StyleDisplay::Inline&&!(mInnerFrame->IsFrameOfType(nsIFrame::eReplaced))&&// An outer SVG frame should behave the same as eReplaced in this case!mInnerFrame->IsSVGOuterSVGFrame()){calcHeight=false;}}if(calcHeight){AssertFlushedPendingReflows();nsMarginadjustedValues=GetAdjustedValuesForBoxSizing();val->SetAppUnits(mInnerFrame->GetContentRect().height+adjustedValues.TopBottom());}else{constnsStylePosition*positionData=StylePosition();nscoordminHeight=StyleCoordToNSCoord(positionData->mMinHeight,&nsComputedDOMStyle::GetCBContentHeight,0,true);nscoordmaxHeight=StyleCoordToNSCoord(positionData->mMaxHeight,&nsComputedDOMStyle::GetCBContentHeight,nscoord_MAX,true);SetValueToCoord(val,positionData->mHeight,true,nullptr,nsCSSProps::kWidthKTable,minHeight,maxHeight);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetWidth(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;boolcalcWidth=false;if(mInnerFrame){calcWidth=true;constnsStyleDisplay*displayData=StyleDisplay();if(displayData->mDisplay==mozilla::StyleDisplay::Inline&&!(mInnerFrame->IsFrameOfType(nsIFrame::eReplaced))&&// An outer SVG frame should behave the same as eReplaced in this case!mInnerFrame->IsSVGOuterSVGFrame()){calcWidth=false;}}if(calcWidth){AssertFlushedPendingReflows();nsMarginadjustedValues=GetAdjustedValuesForBoxSizing();val->SetAppUnits(mInnerFrame->GetContentRect().width+adjustedValues.LeftRight());}else{constnsStylePosition*positionData=StylePosition();nscoordminWidth=StyleCoordToNSCoord(positionData->mMinWidth,&nsComputedDOMStyle::GetCBContentWidth,0,true);nscoordmaxWidth=StyleCoordToNSCoord(positionData->mMaxWidth,&nsComputedDOMStyle::GetCBContentWidth,nscoord_MAX,true);SetValueToCoord(val,positionData->mWidth,true,nullptr,nsCSSProps::kWidthKTable,minWidth,maxWidth);}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaxHeight(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StylePosition()->mMaxHeight,true,nullptr,nsCSSProps::kWidthKTable);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaxWidth(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StylePosition()->mMaxWidth,true,nullptr,nsCSSProps::kWidthKTable);returnval.forget();}boolnsComputedDOMStyle::ShouldHonorMinSizeAutoInAxis(PhysicalAxisaAxis){// A {flex,grid} item's min-{width|height} "auto" value gets special// treatment in getComputedStyle().// https://drafts.csswg.org/css-flexbox-1/#valdef-min-width-auto// https://drafts.csswg.org/css-grid/#min-size-auto// In most cases, "min-{width|height}: auto" is mapped to "0px", unless// we're a flex item (and the min-size is in the flex container's main// axis), or we're a grid item, AND we also have overflow:visible.// Note: We only need to bother checking one "overflow" subproperty for// "visible", because a non-"visible" value in either axis would force the// other axis to also be non-"visible" as well.if(mOuterFrame){nsIFrame*containerFrame=mOuterFrame->GetParent();if(containerFrame&&StyleDisplay()->mOverflowX==NS_STYLE_OVERFLOW_VISIBLE){if(containerFrame->IsFlexContainerFrame()&&(static_cast<nsFlexContainerFrame*>(containerFrame)->IsHorizontal()==(aAxis==eAxisHorizontal))){returntrue;}if(containerFrame->IsGridContainerFrame()){returntrue;}}}returnfalse;}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMinHeight(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsStyleCoordminHeight=StylePosition()->mMinHeight;if(eStyleUnit_Auto==minHeight.GetUnit()&&!ShouldHonorMinSizeAutoInAxis(eAxisVertical)){minHeight.SetCoordValue(0);}SetValueToCoord(val,minHeight,true,nullptr,nsCSSProps::kWidthKTable);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMinWidth(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsStyleCoordminWidth=StylePosition()->mMinWidth;if(eStyleUnit_Auto==minWidth.GetUnit()&&!ShouldHonorMinSizeAutoInAxis(eAxisHorizontal)){minWidth.SetCoordValue(0);}SetValueToCoord(val,minWidth,true,nullptr,nsCSSProps::kWidthKTable);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMixBlendMode(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleEffects()->mMixBlendMode,nsCSSProps::kBlendModeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetIsolation(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleDisplay()->mIsolation,nsCSSProps::kIsolationKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetObjectFit(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StylePosition()->mObjectFit,nsCSSProps::kObjectFitKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetObjectPosition(){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);SetValueToPosition(StylePosition()->mObjectPosition,valueList);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetLeft(){returnGetOffsetWidthFor(eSideLeft);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetRight(){returnGetOffsetWidthFor(eSideRight);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTop(){returnGetOffsetWidthFor(eSideTop);}already_AddRefed<CSSValue>nsComputedDOMStyle::GetOffsetWidthFor(mozilla::SideaSide){constnsStyleDisplay*display=StyleDisplay();AssertFlushedPendingReflows();uint8_tposition=display->mPosition;if(!mOuterFrame){// GetRelativeOffset and GetAbsoluteOffset don't handle elements// without frames in any sensible way. GetStaticOffset, however,// is perfect for that case.position=NS_STYLE_POSITION_STATIC;}switch(position){caseNS_STYLE_POSITION_STATIC:returnGetStaticOffset(aSide);caseNS_STYLE_POSITION_RELATIVE:returnGetRelativeOffset(aSide);caseNS_STYLE_POSITION_STICKY:returnGetStickyOffset(aSide);caseNS_STYLE_POSITION_ABSOLUTE:caseNS_STYLE_POSITION_FIXED:returnGetAbsoluteOffset(aSide);default:NS_ERROR("Invalid position");returnnullptr;}}already_AddRefed<CSSValue>nsComputedDOMStyle::GetAbsoluteOffset(mozilla::SideaSide){MOZ_ASSERT(mOuterFrame,"need a frame, so we can call GetContainingBlock()");nsIFrame*container=mOuterFrame->GetContainingBlock();nsMarginmargin=mOuterFrame->GetUsedMargin();nsMarginborder=container->GetUsedBorder();nsMarginscrollbarSizes(0,0,0,0);nsRectrect=mOuterFrame->GetRect();nsRectcontainerRect=container->GetRect();if(container->IsViewportFrame()){// For absolutely positioned frames scrollbars are taken into// account by virtue of getting a containing block that does// _not_ include the scrollbars. For fixed positioned frames,// the containing block is the viewport, which _does_ include// scrollbars. We have to do some extra work.// the first child in the default frame list is what we wantnsIFrame*scrollingChild=container->PrincipalChildList().FirstChild();nsIScrollableFrame*scrollFrame=do_QueryFrame(scrollingChild);if(scrollFrame){scrollbarSizes=scrollFrame->GetActualScrollbarSizes();}}nscoordoffset=0;switch(aSide){caseeSideTop:offset=rect.y-margin.top-border.top-scrollbarSizes.top;break;caseeSideRight:offset=containerRect.width-rect.width-rect.x-margin.right-border.right-scrollbarSizes.right;break;caseeSideBottom:offset=containerRect.height-rect.height-rect.y-margin.bottom-border.bottom-scrollbarSizes.bottom;break;caseeSideLeft:offset=rect.x-margin.left-border.left-scrollbarSizes.left;break;default:NS_ERROR("Invalid side");break;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetAppUnits(offset);returnval.forget();}static_assert(eSideTop==0&&eSideRight==1&&eSideBottom==2&&eSideLeft==3,"box side constants not as expected for NS_OPPOSITE_SIDE");#define NS_OPPOSITE_SIDE(s_) mozilla::Side(((s_) + 2) & 3)already_AddRefed<CSSValue>nsComputedDOMStyle::GetRelativeOffset(mozilla::SideaSide){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStylePosition*positionData=StylePosition();int32_tsign=1;nsStyleCoordcoord=positionData->mOffset.Get(aSide);NS_ASSERTION(coord.GetUnit()==eStyleUnit_Coord||coord.GetUnit()==eStyleUnit_Percent||coord.GetUnit()==eStyleUnit_Auto||coord.IsCalcUnit(),"Unexpected unit");if(coord.GetUnit()==eStyleUnit_Auto){coord=positionData->mOffset.Get(NS_OPPOSITE_SIDE(aSide));sign=-1;}PercentageBaseGetterbaseGetter;if(aSide==eSideLeft||aSide==eSideRight){baseGetter=&nsComputedDOMStyle::GetCBContentWidth;}else{baseGetter=&nsComputedDOMStyle::GetCBContentHeight;}val->SetAppUnits(sign*StyleCoordToNSCoord(coord,baseGetter,0,false));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetStickyOffset(mozilla::SideaSide){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStylePosition*positionData=StylePosition();nsStyleCoordcoord=positionData->mOffset.Get(aSide);NS_ASSERTION(coord.GetUnit()==eStyleUnit_Coord||coord.GetUnit()==eStyleUnit_Percent||coord.GetUnit()==eStyleUnit_Auto||coord.IsCalcUnit(),"Unexpected unit");if(coord.GetUnit()==eStyleUnit_Auto){val->SetIdent(eCSSKeyword_auto);returnval.forget();}PercentageBaseGetterbaseGetter;if(aSide==eSideLeft||aSide==eSideRight){baseGetter=&nsComputedDOMStyle::GetScrollFrameContentWidth;}else{baseGetter=&nsComputedDOMStyle::GetScrollFrameContentHeight;}val->SetAppUnits(StyleCoordToNSCoord(coord,baseGetter,0,false));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetStaticOffset(mozilla::SideaSide){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StylePosition()->mOffset.Get(aSide),false);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetPaddingWidthFor(mozilla::SideaSide){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;if(!mInnerFrame){SetValueToCoord(val,StylePadding()->mPadding.Get(aSide),true);}else{AssertFlushedPendingReflows();val->SetAppUnits(mInnerFrame->GetUsedPadding().Side(aSide));}returnval.forget();}boolnsComputedDOMStyle::GetLineHeightCoord(nscoord&aCoord){AssertFlushedPendingReflows();nscoordblockHeight=NS_AUTOHEIGHT;if(StyleText()->mLineHeight.GetUnit()==eStyleUnit_Enumerated){if(!mInnerFrame)returnfalse;if(nsLayoutUtils::IsNonWrapperBlock(mInnerFrame)){blockHeight=mInnerFrame->GetContentRect().height;}else{GetCBContentHeight(blockHeight);}}// lie about font size inflation since we lie about font size (since// the inflation only applies to text)aCoord=ReflowInput::CalcLineHeight(mContent,mStyleContext,blockHeight,1.0f);// CalcLineHeight uses font->mFont.size, but we want to use// font->mSize as the font size. Adjust for that. Also adjust for// the text zoom, if any.constnsStyleFont*font=StyleFont();floatfCoord=float(aCoord);if(font->mAllowZoom){fCoord/=mPresShell->GetPresContext()->EffectiveTextZoom();}if(font->mFont.size!=font->mSize){fCoord=fCoord*(float(font->mSize)/float(font->mFont.size));}aCoord=NSToCoordRound(fCoord);returntrue;}already_AddRefed<CSSValue>nsComputedDOMStyle::GetBorderColorsFor(mozilla::SideaSide){constnsStyleBorder*border=StyleBorder();if(border->mBorderColors){nsBorderColors*borderColors=border->mBorderColors[aSide];if(borderColors){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);do{RefPtr<nsROCSSPrimitiveValue>primitive=newnsROCSSPrimitiveValue;SetToRGBAColor(primitive,borderColors->mColor);valueList->AppendCSSValue(primitive.forget());borderColors=borderColors->mNext;}while(borderColors);returnvalueList.forget();}}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetBorderWidthFor(mozilla::SideaSide){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nscoordwidth;if(mInnerFrame){AssertFlushedPendingReflows();width=mInnerFrame->GetUsedBorder().Side(aSide);}else{width=StyleBorder()->GetComputedBorderWidth(aSide);}val->SetAppUnits(width);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetBorderColorFor(mozilla::SideaSide){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueFromComplexColor(val,StyleBorder()->mBorderColor[aSide]);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetMarginWidthFor(mozilla::SideaSide){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;if(!mInnerFrame){SetValueToCoord(val,StyleMargin()->mMargin.Get(aSide),false);}else{AssertFlushedPendingReflows();// For tables, GetUsedMargin always returns an empty margin, so we// should read the margin from the table wrapper frame instead.val->SetAppUnits(mOuterFrame->GetUsedMargin().Side(aSide));NS_ASSERTION(mOuterFrame==mInnerFrame||mInnerFrame->GetUsedMargin()==nsMargin(0,0,0,0),"Inner tables must have zero margins");}returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetBorderStyleFor(mozilla::SideaSide){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleBorder()->GetBorderStyle(aSide),nsCSSProps::kBorderStyleKTable));returnval.forget();}voidnsComputedDOMStyle::SetValueToCoord(nsROCSSPrimitiveValue*aValue,constnsStyleCoord&aCoord,boolaClampNegativeCalc,PercentageBaseGetteraPercentageBaseGetter,constKTableEntryaTable[],nscoordaMinAppUnits,nscoordaMaxAppUnits){NS_PRECONDITION(aValue,"Must have a value to work with");switch(aCoord.GetUnit()){caseeStyleUnit_Normal:aValue->SetIdent(eCSSKeyword_normal);break;caseeStyleUnit_Auto:aValue->SetIdent(eCSSKeyword_auto);break;caseeStyleUnit_Percent:{nscoordpercentageBase;if(aPercentageBaseGetter&&(this->*aPercentageBaseGetter)(percentageBase)){nscoordval=NSCoordSaturatingMultiply(percentageBase,aCoord.GetPercentValue());aValue->SetAppUnits(std::max(aMinAppUnits,std::min(val,aMaxAppUnits)));}else{aValue->SetPercent(aCoord.GetPercentValue());}}break;caseeStyleUnit_Factor:aValue->SetNumber(aCoord.GetFactorValue());break;caseeStyleUnit_Coord:{nscoordval=aCoord.GetCoordValue();aValue->SetAppUnits(std::max(aMinAppUnits,std::min(val,aMaxAppUnits)));}break;caseeStyleUnit_Integer:aValue->SetNumber(aCoord.GetIntValue());break;caseeStyleUnit_Enumerated:NS_ASSERTION(aTable,"Must have table to handle this case");aValue->SetIdent(nsCSSProps::ValueToKeywordEnum(aCoord.GetIntValue(),aTable));break;caseeStyleUnit_None:aValue->SetIdent(eCSSKeyword_none);break;caseeStyleUnit_Calc:nscoordpercentageBase;if(!aCoord.CalcHasPercent()){nscoordval=nsRuleNode::ComputeCoordPercentCalc(aCoord,0);if(aClampNegativeCalc&&val<0){MOZ_ASSERT(aCoord.IsCalcUnit(),"parser should have rejected value");val=0;}aValue->SetAppUnits(std::max(aMinAppUnits,std::min(val,aMaxAppUnits)));}elseif(aPercentageBaseGetter&&(this->*aPercentageBaseGetter)(percentageBase)){nscoordval=nsRuleNode::ComputeCoordPercentCalc(aCoord,percentageBase);if(aClampNegativeCalc&&val<0){MOZ_ASSERT(aCoord.IsCalcUnit(),"parser should have rejected value");val=0;}aValue->SetAppUnits(std::max(aMinAppUnits,std::min(val,aMaxAppUnits)));}else{nsStyleCoord::Calc*calc=aCoord.GetCalcValue();SetValueToCalc(calc,aValue);}break;caseeStyleUnit_Degree:aValue->SetDegree(aCoord.GetAngleValue());break;caseeStyleUnit_Grad:aValue->SetGrad(aCoord.GetAngleValue());break;caseeStyleUnit_Radian:aValue->SetRadian(aCoord.GetAngleValue());break;caseeStyleUnit_Turn:aValue->SetTurn(aCoord.GetAngleValue());break;caseeStyleUnit_FlexFraction:{nsAutoStringtmpStr;nsStyleUtil::AppendCSSNumber(aCoord.GetFlexFractionValue(),tmpStr);tmpStr.AppendLiteral("fr");aValue->SetString(tmpStr);break;}default:NS_ERROR("Can't handle this unit");break;}}nscoordnsComputedDOMStyle::StyleCoordToNSCoord(constnsStyleCoord&aCoord,PercentageBaseGetteraPercentageBaseGetter,nscoordaDefaultValue,boolaClampNegativeCalc){NS_PRECONDITION(aPercentageBaseGetter,"Must have a percentage base getter");if(aCoord.GetUnit()==eStyleUnit_Coord){returnaCoord.GetCoordValue();}if(aCoord.GetUnit()==eStyleUnit_Percent||aCoord.IsCalcUnit()){nscoordpercentageBase;if((this->*aPercentageBaseGetter)(percentageBase)){nscoordresult=nsRuleNode::ComputeCoordPercentCalc(aCoord,percentageBase);if(aClampNegativeCalc&&result<0){// It's expected that we can get a negative value here with calc().// We can also get a negative value with a percentage value if// percentageBase is negative; this isn't expected, but can happen// when large length values overflow.NS_WARNING_ASSERTION(percentageBase>=0,"percentage base value overflowed to become negative for a property ""that disallows negative values");MOZ_ASSERT(aCoord.IsCalcUnit()||(aCoord.HasPercent()&&percentageBase<0),"parser should have rejected value");result=0;}returnresult;}// Fall through to returning aDefaultValue if we have no percentage base.}returnaDefaultValue;}boolnsComputedDOMStyle::GetCBContentWidth(nscoord&aWidth){if(!mOuterFrame){returnfalse;}AssertFlushedPendingReflows();nsIFrame*container=mOuterFrame->GetContainingBlock();aWidth=container->GetContentRect().width;returntrue;}boolnsComputedDOMStyle::GetCBContentHeight(nscoord&aHeight){if(!mOuterFrame){returnfalse;}AssertFlushedPendingReflows();nsIFrame*container=mOuterFrame->GetContainingBlock();aHeight=container->GetContentRect().height;returntrue;}boolnsComputedDOMStyle::GetScrollFrameContentWidth(nscoord&aWidth){if(!mOuterFrame){returnfalse;}AssertFlushedPendingReflows();nsIScrollableFrame*scrollableFrame=nsLayoutUtils::GetNearestScrollableFrame(mOuterFrame->GetParent(),nsLayoutUtils::SCROLLABLE_SAME_DOC|nsLayoutUtils::SCROLLABLE_INCLUDE_HIDDEN);if(!scrollableFrame){returnfalse;}aWidth=scrollableFrame->GetScrolledFrame()->GetContentRectRelativeToSelf().width;returntrue;}boolnsComputedDOMStyle::GetScrollFrameContentHeight(nscoord&aHeight){if(!mOuterFrame){returnfalse;}AssertFlushedPendingReflows();nsIScrollableFrame*scrollableFrame=nsLayoutUtils::GetNearestScrollableFrame(mOuterFrame->GetParent(),nsLayoutUtils::SCROLLABLE_SAME_DOC|nsLayoutUtils::SCROLLABLE_INCLUDE_HIDDEN);if(!scrollableFrame){returnfalse;}aHeight=scrollableFrame->GetScrolledFrame()->GetContentRectRelativeToSelf().height;returntrue;}boolnsComputedDOMStyle::GetFrameBorderRectWidth(nscoord&aWidth){if(!mInnerFrame){returnfalse;}AssertFlushedPendingReflows();aWidth=mInnerFrame->GetSize().width;returntrue;}boolnsComputedDOMStyle::GetFrameBorderRectHeight(nscoord&aHeight){if(!mInnerFrame){returnfalse;}AssertFlushedPendingReflows();aHeight=mInnerFrame->GetSize().height;returntrue;}boolnsComputedDOMStyle::GetFrameBoundsWidthForTransform(nscoord&aWidth){// We need a frame to work with.if(!mInnerFrame){returnfalse;}AssertFlushedPendingReflows();aWidth=nsStyleTransformMatrix::TransformReferenceBox(mInnerFrame).Width();returntrue;}boolnsComputedDOMStyle::GetFrameBoundsHeightForTransform(nscoord&aHeight){// We need a frame to work with.if(!mInnerFrame){returnfalse;}AssertFlushedPendingReflows();aHeight=nsStyleTransformMatrix::TransformReferenceBox(mInnerFrame).Height();returntrue;}already_AddRefed<CSSValue>nsComputedDOMStyle::GetFallbackValue(constnsStyleSVGPaint*aPaint){RefPtr<nsROCSSPrimitiveValue>fallback=newnsROCSSPrimitiveValue;if(aPaint->GetFallbackType()==eStyleSVGFallbackType_Color){SetToRGBAColor(fallback,aPaint->GetFallbackColor());}else{fallback->SetIdent(eCSSKeyword_none);}returnfallback.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetSVGPaintFor(boolaFill){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;constnsStyleSVG*svg=StyleSVG();constnsStyleSVGPaint*paint=aFill?&svg->mFill:&svg->mStroke;nsAutoStringpaintString;switch(paint->Type()){caseeStyleSVGPaintType_None:val->SetIdent(eCSSKeyword_none);break;caseeStyleSVGPaintType_Color:SetToRGBAColor(val,paint->GetColor());break;caseeStyleSVGPaintType_Server:{SetValueToURLValue(paint->GetPaintServer(),val);if(paint->GetFallbackType()!=eStyleSVGFallbackType_NotSet){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);RefPtr<CSSValue>fallback=GetFallbackValue(paint);valueList->AppendCSSValue(val.forget());valueList->AppendCSSValue(fallback.forget());returnvalueList.forget();}break;}caseeStyleSVGPaintType_ContextFill:caseeStyleSVGPaintType_ContextStroke:{val->SetIdent(paint->Type()==eStyleSVGPaintType_ContextFill?eCSSKeyword_context_fill:eCSSKeyword_context_stroke);if(paint->GetFallbackType()!=eStyleSVGFallbackType_NotSet){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);RefPtr<CSSValue>fallback=GetFallbackValue(paint);valueList->AppendCSSValue(val.forget());valueList->AppendCSSValue(fallback.forget());returnvalueList.forget();}break;}}returnval.forget();}/* If the property is "none", hand back "none" wrapped in a value. * Otherwise, compute the aggregate transform matrix and hands it back in a * "matrix" wrapper. */already_AddRefed<CSSValue>nsComputedDOMStyle::GetTransformValue(nsCSSValueSharedList*aSpecifiedTransform){/* If there are no transforms, then we should construct a single-element * entry and hand it back. */if(!aSpecifiedTransform){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;/* Set it to "none." */val->SetIdent(eCSSKeyword_none);returnval.forget();}/* Otherwise, we need to compute the current value of the transform matrix, * store it in a string, and hand it back to the caller. *//* Use the inner frame for the reference box. If we don't have an inner * frame we use empty dimensions to allow us to continue (and percentage * values in the transform will simply give broken results). * TODO: There is no good way for us to represent the case where there's no * frame, which is problematic. The reason is that when we have percentage * transforms, there are a total of four stored matrix entries that influence * the transform based on the size of the element. However, this poses a * problem, because only two of these values can be explicitly referenced * using the named transforms. Until a real solution is found, we'll just * use this approach. */nsStyleTransformMatrix::TransformReferenceBoxrefBox(mInnerFrame,nsSize(0,0));RuleNodeCacheConditionsdummy;booldummyBool;gfx::Matrix4x4matrix=nsStyleTransformMatrix::ReadTransforms(aSpecifiedTransform->mHead,mStyleContext,mStyleContext->PresContext(),dummy,refBox,float(mozilla::AppUnitsPerCSSPixel()),&dummyBool);returnMatrixToCSSValue(matrix);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFill(){returnGetSVGPaintFor(true);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStroke(){returnGetSVGPaintFor(false);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMarkerEnd(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToURLValue(StyleSVG()->mMarkerEnd,val);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMarkerMid(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToURLValue(StyleSVG()->mMarkerMid,val);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMarkerStart(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToURLValue(StyleSVG()->mMarkerStart,val);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStrokeDasharray(){constnsStyleSVG*svg=StyleSVG();if(svg->mStrokeDasharray.IsEmpty()){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(uint32_ti=0;i<svg->mStrokeDasharray.Length();i++){RefPtr<nsROCSSPrimitiveValue>dash=newnsROCSSPrimitiveValue;SetValueToCoord(dash,svg->mStrokeDasharray[i],true);valueList->AppendCSSValue(dash.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStrokeDashoffset(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StyleSVG()->mStrokeDashoffset,false);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStrokeWidth(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToCoord(val,StyleSVG()->mStrokeWidth,true);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetVectorEffect(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVGReset()->mVectorEffect,nsCSSProps::kVectorEffectKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFillOpacity(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleSVG()->mFillOpacity);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFloodOpacity(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleSVGReset()->mFloodOpacity);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStopOpacity(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleSVGReset()->mStopOpacity);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStrokeMiterlimit(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleSVG()->mStrokeMiterlimit);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStrokeOpacity(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetNumber(StyleSVG()->mStrokeOpacity);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetClipRule(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVG()->mClipRule,nsCSSProps::kFillRuleKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFillRule(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVG()->mFillRule,nsCSSProps::kFillRuleKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStrokeLinecap(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVG()->mStrokeLinecap,nsCSSProps::kStrokeLinecapKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStrokeLinejoin(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVG()->mStrokeLinejoin,nsCSSProps::kStrokeLinejoinKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextAnchor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVG()->mTextAnchor,nsCSSProps::kTextAnchorKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColorInterpolation(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVG()->mColorInterpolation,nsCSSProps::kColorInterpolationKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetColorInterpolationFilters(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVG()->mColorInterpolationFilters,nsCSSProps::kColorInterpolationKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetDominantBaseline(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVGReset()->mDominantBaseline,nsCSSProps::kDominantBaselineKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetImageRendering(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleVisibility()->mImageRendering,nsCSSProps::kImageRenderingKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetShapeRendering(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVG()->mShapeRendering,nsCSSProps::kShapeRenderingKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTextRendering(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleText()->mTextRendering,nsCSSProps::kTextRenderingKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFloodColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetToRGBAColor(val,StyleSVGReset()->mFloodColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetLightingColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetToRGBAColor(val,StyleSVGReset()->mLightingColor);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetStopColor(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetToRGBAColor(val,StyleSVGReset()->mStopColor);returnval.forget();}voidnsComputedDOMStyle::BoxValuesToString(nsAString&aString,constnsTArray<nsStyleCoord>&aBoxValues){MOZ_ASSERT(aBoxValues.Length()==4,"wrong number of box values");nsAutoStringvalue1,value2,value3,value4;SetCssTextToCoord(value1,aBoxValues[0]);SetCssTextToCoord(value2,aBoxValues[1]);SetCssTextToCoord(value3,aBoxValues[2]);SetCssTextToCoord(value4,aBoxValues[3]);// nsROCSSPrimitiveValue do not have binary comparison operators.// Compare string results instead.aString.Append(value1);if(value1!=value2||value1!=value3||value1!=value4){aString.Append(' ');aString.Append(value2);if(value1!=value3||value2!=value4){aString.Append(' ');aString.Append(value3);if(value2!=value4){aString.Append(' ');aString.Append(value4);}}}}voidnsComputedDOMStyle::BasicShapeRadiiToString(nsAString&aCssText,constnsStyleCorners&aCorners){nsTArray<nsStyleCoord>horizontal,vertical;nsAutoStringhorizontalString,verticalString;NS_FOR_CSS_FULL_CORNERS(corner){horizontal.AppendElement(aCorners.Get(FullToHalfCorner(corner,false)));vertical.AppendElement(aCorners.Get(FullToHalfCorner(corner,true)));}BoxValuesToString(horizontalString,horizontal);BoxValuesToString(verticalString,vertical);aCssText.Append(horizontalString);if(horizontalString==verticalString){return;}aCssText.AppendLiteral(" / ");aCssText.Append(verticalString);}already_AddRefed<CSSValue>nsComputedDOMStyle::CreatePrimitiveValueForBasicShape(constStyleBasicShape*aStyleBasicShape){MOZ_ASSERT(aStyleBasicShape,"Expect a valid basic shape pointer!");StyleBasicShapeTypetype=aStyleBasicShape->GetShapeType();// Shape function name and opening parenthesis.nsAutoStringshapeFunctionString;AppendASCIItoUTF16(nsCSSKeywords::GetStringValue(aStyleBasicShape->GetShapeTypeName()),shapeFunctionString);shapeFunctionString.Append('(');switch(type){caseStyleBasicShapeType::Polygon:{boolhasEvenOdd=aStyleBasicShape->GetFillRule()==StyleFillRule::Evenodd;if(hasEvenOdd){shapeFunctionString.AppendLiteral("evenodd");}for(size_ti=0;i<aStyleBasicShape->Coordinates().Length();i+=2){nsAutoStringcoordString;if(i>0||hasEvenOdd){shapeFunctionString.AppendLiteral(", ");}SetCssTextToCoord(coordString,aStyleBasicShape->Coordinates()[i]);shapeFunctionString.Append(coordString);shapeFunctionString.Append(' ');SetCssTextToCoord(coordString,aStyleBasicShape->Coordinates()[i+1]);shapeFunctionString.Append(coordString);}break;}caseStyleBasicShapeType::Circle:caseStyleBasicShapeType::Ellipse:{constnsTArray<nsStyleCoord>&radii=aStyleBasicShape->Coordinates();MOZ_ASSERT(radii.Length()==(type==StyleBasicShapeType::Circle?1:2),"wrong number of radii");for(size_ti=0;i<radii.Length();++i){nsAutoStringradius;RefPtr<nsROCSSPrimitiveValue>value=newnsROCSSPrimitiveValue;boolclampNegativeCalc=true;SetValueToCoord(value,radii[i],clampNegativeCalc,nullptr,nsCSSProps::kShapeRadiusKTable);value->GetCssText(radius);shapeFunctionString.Append(radius);shapeFunctionString.Append(' ');}shapeFunctionString.AppendLiteral("at ");RefPtr<nsDOMCSSValueList>position=GetROCSSValueList(false);nsAutoStringpositionString;SetValueToPosition(aStyleBasicShape->GetPosition(),position);position->GetCssText(positionString);shapeFunctionString.Append(positionString);break;}caseStyleBasicShapeType::Inset:{BoxValuesToString(shapeFunctionString,aStyleBasicShape->Coordinates());if(aStyleBasicShape->HasRadius()){shapeFunctionString.AppendLiteral(" round ");nsAutoStringradiiString;BasicShapeRadiiToString(radiiString,aStyleBasicShape->GetRadius());shapeFunctionString.Append(radiiString);}break;}default:NS_NOTREACHED("unexpected type");}shapeFunctionString.Append(')');RefPtr<nsROCSSPrimitiveValue>functionValue=newnsROCSSPrimitiveValue;functionValue->SetString(shapeFunctionString);returnfunctionValue.forget();}template<typenameReferenceBox>already_AddRefed<CSSValue>nsComputedDOMStyle::CreatePrimitiveValueForShapeSource(constStyleBasicShape*aStyleBasicShape,ReferenceBoxaReferenceBox,constKTableEntryaBoxKeywordTable[]){RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);if(aStyleBasicShape){valueList->AppendCSSValue(CreatePrimitiveValueForBasicShape(aStyleBasicShape));}if(aReferenceBox==ReferenceBox::NoBox){returnvalueList.forget();}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(aReferenceBox,aBoxKeywordTable));valueList->AppendCSSValue(val.forget());returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::GetShapeSource(constStyleShapeSource&aShapeSource,constKTableEntryaBoxKeywordTable[]){switch(aShapeSource.GetType()){caseStyleShapeSourceType::Shape:returnCreatePrimitiveValueForShapeSource(aShapeSource.GetBasicShape(),aShapeSource.GetReferenceBox(),aBoxKeywordTable);caseStyleShapeSourceType::Box:returnCreatePrimitiveValueForShapeSource(nullptr,aShapeSource.GetReferenceBox(),aBoxKeywordTable);caseStyleShapeSourceType::URL:{RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToURLValue(aShapeSource.GetURL(),val);returnval.forget();}caseStyleShapeSourceType::None:{RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}default:NS_NOTREACHED("unexpected type");}returnnullptr;}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetClipPath(){returnGetShapeSource(StyleSVGReset()->mClipPath,nsCSSProps::kClipPathGeometryBoxKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetShapeOutside(){returnGetShapeSource(StyleDisplay()->mShapeOutside,nsCSSProps::kShapeOutsideShapeBoxKTable);}voidnsComputedDOMStyle::SetCssTextToCoord(nsAString&aCssText,constnsStyleCoord&aCoord){RefPtr<nsROCSSPrimitiveValue>value=newnsROCSSPrimitiveValue;boolclampNegativeCalc=true;SetValueToCoord(value,aCoord,clampNegativeCalc);value->GetCssText(aCssText);}already_AddRefed<CSSValue>nsComputedDOMStyle::CreatePrimitiveValueForStyleFilter(constnsStyleFilter&aStyleFilter){RefPtr<nsROCSSPrimitiveValue>value=newnsROCSSPrimitiveValue;// Handle url().if(aStyleFilter.GetType()==NS_STYLE_FILTER_URL){MOZ_ASSERT(aStyleFilter.GetURL()&&aStyleFilter.GetURL()->GetURI());SetValueToURLValue(aStyleFilter.GetURL(),value);returnvalue.forget();}// Filter function name and opening parenthesis.nsAutoStringfilterFunctionString;AppendASCIItoUTF16(nsCSSProps::ValueToKeyword(aStyleFilter.GetType(),nsCSSProps::kFilterFunctionKTable),filterFunctionString);filterFunctionString.Append('(');nsAutoStringargumentString;if(aStyleFilter.GetType()==NS_STYLE_FILTER_DROP_SHADOW){// Handle drop-shadow()RefPtr<CSSValue>shadowValue=GetCSSShadowArray(aStyleFilter.GetDropShadow(),StyleColor()->mColor,false);ErrorResultdummy;shadowValue->GetCssText(argumentString,dummy);}else{// Filter function argument.SetCssTextToCoord(argumentString,aStyleFilter.GetFilterParameter());}filterFunctionString.Append(argumentString);// Filter function closing parenthesis.filterFunctionString.Append(')');value->SetString(filterFunctionString);returnvalue.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetFilter(){constnsTArray<nsStyleFilter>&filters=StyleEffects()->mFilters;if(filters.IsEmpty()){RefPtr<nsROCSSPrimitiveValue>value=newnsROCSSPrimitiveValue;value->SetIdent(eCSSKeyword_none);returnvalue.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(false);for(uint32_ti=0;i<filters.Length();i++){RefPtr<CSSValue>value=CreatePrimitiveValueForStyleFilter(filters[i]);valueList->AppendCSSValue(value.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMask(){constnsStyleSVGReset*svg=StyleSVGReset();constnsStyleImageLayers::Layer&firstLayer=svg->mMask.mLayers[0];// Mask is now a shorthand, but it used to be a longhand, so that we// need to support computed style for the cases where it used to be// a longhand.if(svg->mMask.mImageCount>1||firstLayer.mClip!=StyleGeometryBox::BorderBox||firstLayer.mOrigin!=StyleGeometryBox::BorderBox||firstLayer.mComposite!=NS_STYLE_MASK_COMPOSITE_ADD||firstLayer.mMaskMode!=NS_STYLE_MASK_MODE_MATCH_SOURCE||!nsStyleImageLayers::IsInitialPositionForLayerType(firstLayer.mPosition,nsStyleImageLayers::LayerType::Mask)||!firstLayer.mRepeat.IsInitialValue()||!firstLayer.mSize.IsInitialValue()||!(firstLayer.mImage.GetType()==eStyleImageType_Null||firstLayer.mImage.GetType()==eStyleImageType_Image||firstLayer.mImage.GetType()==eStyleImageType_URL)){returnnullptr;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;SetValueToURLValue(firstLayer.mImage.GetURLValue(),val);returnval.forget();}#ifdef MOZ_ENABLE_MASK_AS_SHORTHANDalready_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskClip(){returnGetBackgroundList(&nsStyleImageLayers::Layer::mClip,&nsStyleImageLayers::mClipCount,StyleSVGReset()->mMask,nsCSSProps::kMaskClipKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskComposite(){returnGetBackgroundList(&nsStyleImageLayers::Layer::mComposite,&nsStyleImageLayers::mCompositeCount,StyleSVGReset()->mMask,nsCSSProps::kImageLayerCompositeKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskImage(){constnsStyleImageLayers&layers=StyleSVGReset()->mMask;returnDoGetImageLayerImage(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskMode(){returnGetBackgroundList(&nsStyleImageLayers::Layer::mMaskMode,&nsStyleImageLayers::mMaskModeCount,StyleSVGReset()->mMask,nsCSSProps::kImageLayerModeKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskOrigin(){returnGetBackgroundList(&nsStyleImageLayers::Layer::mOrigin,&nsStyleImageLayers::mOriginCount,StyleSVGReset()->mMask,nsCSSProps::kMaskOriginKTable);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskPosition(){constnsStyleImageLayers&layers=StyleSVGReset()->mMask;returnDoGetImageLayerPosition(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskPositionX(){constnsStyleImageLayers&layers=StyleSVGReset()->mMask;returnDoGetImageLayerPositionX(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskPositionY(){constnsStyleImageLayers&layers=StyleSVGReset()->mMask;returnDoGetImageLayerPositionY(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskRepeat(){constnsStyleImageLayers&layers=StyleSVGReset()->mMask;returnDoGetImageLayerRepeat(layers);}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskSize(){constnsStyleImageLayers&layers=StyleSVGReset()->mMask;returnDoGetImageLayerSize(layers);}#endifalready_AddRefed<CSSValue>nsComputedDOMStyle::DoGetMaskType(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(nsCSSProps::ValueToKeywordEnum(StyleSVGReset()->mMaskType,nsCSSProps::kMaskTypeKTable));returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetContextProperties(){constnsTArray<nsCOMPtr<nsIAtom>>&contextProps=StyleSVG()->mContextProps;if(contextProps.IsEmpty()){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetIdent(eCSSKeyword_none);returnval.forget();}RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);for(constnsIAtom*ident:contextProps){RefPtr<nsROCSSPrimitiveValue>property=newnsROCSSPrimitiveValue;property->SetString(nsDependentAtomString(ident));valueList->AppendCSSValue(property.forget());}returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetPaintOrder(){RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;nsAutoStringstring;uint8_tpaintOrder=StyleSVG()->mPaintOrder;nsStyleUtil::AppendPaintOrderValue(paintOrder,string);val->SetString(string);returnval.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTransitionDelay(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mTransitionDelayCount>0,"first item must be explicit");uint32_ti=0;do{constStyleTransition*transition=&display->mTransitions[i];RefPtr<nsROCSSPrimitiveValue>delay=newnsROCSSPrimitiveValue;delay->SetTime((float)transition->GetDelay()/(float)PR_MSEC_PER_SEC);valueList->AppendCSSValue(delay.forget());}while(++i<display->mTransitionDelayCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTransitionDuration(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mTransitionDurationCount>0,"first item must be explicit");uint32_ti=0;do{constStyleTransition*transition=&display->mTransitions[i];RefPtr<nsROCSSPrimitiveValue>duration=newnsROCSSPrimitiveValue;duration->SetTime((float)transition->GetDuration()/(float)PR_MSEC_PER_SEC);valueList->AppendCSSValue(duration.forget());}while(++i<display->mTransitionDurationCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTransitionProperty(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mTransitionPropertyCount>0,"first item must be explicit");uint32_ti=0;do{constStyleTransition*transition=&display->mTransitions[i];RefPtr<nsROCSSPrimitiveValue>property=newnsROCSSPrimitiveValue;nsCSSPropertyIDcssprop=transition->GetProperty();if(cssprop==eCSSPropertyExtra_all_properties)property->SetIdent(eCSSKeyword_all);elseif(cssprop==eCSSPropertyExtra_no_properties)property->SetIdent(eCSSKeyword_none);elseif(cssprop==eCSSProperty_UNKNOWN||cssprop==eCSSPropertyExtra_variable){nsAutoStringescaped;nsStyleUtil::AppendEscapedCSSIdent(nsDependentAtomString(transition->GetUnknownProperty()),escaped);property->SetString(escaped);// really want SetIdent}elseproperty->SetString(nsCSSProps::GetStringValue(cssprop));valueList->AppendCSSValue(property.forget());}while(++i<display->mTransitionPropertyCount);returnvalueList.forget();}voidnsComputedDOMStyle::AppendTimingFunction(nsDOMCSSValueList*aValueList,constnsTimingFunction&aTimingFunction){RefPtr<nsROCSSPrimitiveValue>timingFunction=newnsROCSSPrimitiveValue;nsAutoStringtmp;switch(aTimingFunction.mType){casensTimingFunction::Type::CubicBezier:nsStyleUtil::AppendCubicBezierTimingFunction(aTimingFunction.mFunc.mX1,aTimingFunction.mFunc.mY1,aTimingFunction.mFunc.mX2,aTimingFunction.mFunc.mY2,tmp);break;casensTimingFunction::Type::StepStart:casensTimingFunction::Type::StepEnd:nsStyleUtil::AppendStepsTimingFunction(aTimingFunction.mType,aTimingFunction.mStepsOrFrames,tmp);break;casensTimingFunction::Type::Frames:nsStyleUtil::AppendFramesTimingFunction(aTimingFunction.mStepsOrFrames,tmp);break;default:nsStyleUtil::AppendCubicBezierKeywordTimingFunction(aTimingFunction.mType,tmp);break;}timingFunction->SetString(tmp);aValueList->AppendCSSValue(timingFunction.forget());}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetTransitionTimingFunction(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mTransitionTimingFunctionCount>0,"first item must be explicit");uint32_ti=0;do{AppendTimingFunction(valueList,display->mTransitions[i].GetTimingFunction());}while(++i<display->mTransitionTimingFunctionCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAnimationName(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mAnimationNameCount>0,"first item must be explicit");uint32_ti=0;do{constStyleAnimation*animation=&display->mAnimations[i];RefPtr<nsROCSSPrimitiveValue>property=newnsROCSSPrimitiveValue;constnsString&name=animation->GetName();if(name.IsEmpty()){property->SetIdent(eCSSKeyword_none);}else{nsAutoStringescaped;nsStyleUtil::AppendEscapedCSSIdent(animation->GetName(),escaped);property->SetString(escaped);// really want SetIdent}valueList->AppendCSSValue(property.forget());}while(++i<display->mAnimationNameCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAnimationDelay(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mAnimationDelayCount>0,"first item must be explicit");uint32_ti=0;do{constStyleAnimation*animation=&display->mAnimations[i];RefPtr<nsROCSSPrimitiveValue>delay=newnsROCSSPrimitiveValue;delay->SetTime((float)animation->GetDelay()/(float)PR_MSEC_PER_SEC);valueList->AppendCSSValue(delay.forget());}while(++i<display->mAnimationDelayCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAnimationDuration(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mAnimationDurationCount>0,"first item must be explicit");uint32_ti=0;do{constStyleAnimation*animation=&display->mAnimations[i];RefPtr<nsROCSSPrimitiveValue>duration=newnsROCSSPrimitiveValue;duration->SetTime((float)animation->GetDuration()/(float)PR_MSEC_PER_SEC);valueList->AppendCSSValue(duration.forget());}while(++i<display->mAnimationDurationCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAnimationTimingFunction(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mAnimationTimingFunctionCount>0,"first item must be explicit");uint32_ti=0;do{AppendTimingFunction(valueList,display->mAnimations[i].GetTimingFunction());}while(++i<display->mAnimationTimingFunctionCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAnimationDirection(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mAnimationDirectionCount>0,"first item must be explicit");uint32_ti=0;do{constStyleAnimation*animation=&display->mAnimations[i];RefPtr<nsROCSSPrimitiveValue>direction=newnsROCSSPrimitiveValue;direction->SetIdent(nsCSSProps::ValueToKeywordEnum(static_cast<int32_t>(animation->GetDirection()),nsCSSProps::kAnimationDirectionKTable));valueList->AppendCSSValue(direction.forget());}while(++i<display->mAnimationDirectionCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAnimationFillMode(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mAnimationFillModeCount>0,"first item must be explicit");uint32_ti=0;do{constStyleAnimation*animation=&display->mAnimations[i];RefPtr<nsROCSSPrimitiveValue>fillMode=newnsROCSSPrimitiveValue;fillMode->SetIdent(nsCSSProps::ValueToKeywordEnum(static_cast<int32_t>(animation->GetFillMode()),nsCSSProps::kAnimationFillModeKTable));valueList->AppendCSSValue(fillMode.forget());}while(++i<display->mAnimationFillModeCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAnimationIterationCount(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mAnimationIterationCountCount>0,"first item must be explicit");uint32_ti=0;do{constStyleAnimation*animation=&display->mAnimations[i];RefPtr<nsROCSSPrimitiveValue>iterationCount=newnsROCSSPrimitiveValue;floatf=animation->GetIterationCount();/* Need a nasty hack here to work around an optimizer bug in gcc 4.2 on Mac, which somehow gets confused when directly comparing a float to the return value of NS_IEEEPositiveInfinity when building 32-bit builds. */#ifdef XP_MACOSXvolatile#endiffloatinf=NS_IEEEPositiveInfinity();if(f==inf){iterationCount->SetIdent(eCSSKeyword_infinite);}else{iterationCount->SetNumber(f);}valueList->AppendCSSValue(iterationCount.forget());}while(++i<display->mAnimationIterationCountCount);returnvalueList.forget();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetAnimationPlayState(){constnsStyleDisplay*display=StyleDisplay();RefPtr<nsDOMCSSValueList>valueList=GetROCSSValueList(true);MOZ_ASSERT(display->mAnimationPlayStateCount>0,"first item must be explicit");uint32_ti=0;do{constStyleAnimation*animation=&display->mAnimations[i];RefPtr<nsROCSSPrimitiveValue>playState=newnsROCSSPrimitiveValue;playState->SetIdent(nsCSSProps::ValueToKeywordEnum(animation->GetPlayState(),nsCSSProps::kAnimationPlayStateKTable));valueList->AppendCSSValue(playState.forget());}while(++i<display->mAnimationPlayStateCount);returnvalueList.forget();}staticvoidMarkComputedStyleMapDirty(constchar*aPref,void*aData){static_cast<nsComputedStyleMap*>(aData)->MarkDirty();}already_AddRefed<CSSValue>nsComputedDOMStyle::DoGetCustomProperty(constnsAString&aPropertyName){MOZ_ASSERT(nsCSSProps::IsCustomPropertyName(aPropertyName));nsStringvariableValue;constnsAString&name=Substring(aPropertyName,CSS_CUSTOM_NAME_PREFIX_LENGTH);boolpresent=mStyleContext->IsServo()?Servo_GetCustomPropertyValue(mStyleContext->ComputedValues(),&name,&variableValue):StyleVariables()->mVariables.Get(name,variableValue);if(!present){returnnullptr;}RefPtr<nsROCSSPrimitiveValue>val=newnsROCSSPrimitiveValue;val->SetString(variableValue);returnval.forget();}voidnsComputedDOMStyle::ParentChainChanged(nsIContent*aContent){NS_ASSERTION(mContent==aContent,"didn't we register mContent?");NS_ASSERTION(mResolvedStyleContext,"should have only registered an observer when ""mResolvedStyleContext is true");ClearStyleContext();}/* static */nsComputedStyleMap*nsComputedDOMStyle::GetComputedStyleMap(){staticnsComputedStyleMapmap={{#define COMPUTED_STYLE_PROP(prop_, method_) \ { eCSSProperty_##prop_, &nsComputedDOMStyle::DoGet##method_ },#include"nsComputedDOMStylePropertyList.h"#undef COMPUTED_STYLE_PROP}};return↦}/* static */voidnsComputedDOMStyle::RegisterPrefChangeCallbacks(){// Note that this will register callbacks for all properties with prefs, not// just those that are implemented on computed style objects, as it's not// easy to grab specific property data from nsCSSPropList.h based on the// entries iterated in nsComputedDOMStylePropertyList.h.nsComputedStyleMap*data=GetComputedStyleMap();#define REGISTER_CALLBACK(pref_) \ if (pref_[0]) { \ Preferences::RegisterCallback(MarkComputedStyleMapDirty, pref_, data); \ }#define CSS_PROP(prop_, id_, method_, flags_, pref_, parsevariant_, \ kwtable_, stylestruct_, stylestructoffset_, animtype_) \ REGISTER_CALLBACK(pref_)#define CSS_PROP_LIST_INCLUDE_LOGICAL#include"nsCSSPropList.h"#undef CSS_PROP_LIST_INCLUDE_LOGICAL#undef CSS_PROP#undef REGISTER_CALLBACK}/* static */voidnsComputedDOMStyle::UnregisterPrefChangeCallbacks(){nsComputedStyleMap*data=GetComputedStyleMap();#define UNREGISTER_CALLBACK(pref_) \ if (pref_[0]) { \ Preferences::UnregisterCallback(MarkComputedStyleMapDirty, pref_, data); \ }#define CSS_PROP(prop_, id_, method_, flags_, pref_, parsevariant_, \ kwtable_, stylestruct_, stylestructoffset_, animtype_) \ UNREGISTER_CALLBACK(pref_)#define CSS_PROP_LIST_INCLUDE_LOGICAL#include"nsCSSPropList.h"#undef CSS_PROP_LIST_INCLUDE_LOGICAL#undef CSS_PROP#undef UNREGISTER_CALLBACK}